【问题标题】:Could you help me to merge values of several maps?你能帮我合并几个地图的值吗?
【发布时间】:2019-04-08 19:52:49
【问题描述】:

我正在尝试进行以下修改:

final Map<String, List<Map<String, String>>> scopes = scopeService.fetchAndCacheScopesDetails();
final Map<String, Map<String, String>> scopesResponse = scopes.entrySet().stream().collect
        (Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
                .stream().collect(Collectors.toMap(s -> (String) s.get(SCOPE_NM), s -> (String) s.get(SCOPE_ID))))
        );

但我遇到"Duplicate key" 错误,所以我想将scopeResponses 更改为Map&lt;String, Map&lt;String, List&lt;String&gt;&gt;&gt;

您能告诉我在这种情况下如何将值 s -&gt; (String) s.get(SCOPE_ID) 合并到 ListSet 中吗?

【问题讨论】:

    标签: java java-8 hashmap java-stream collectors


    【解决方案1】:

    您需要为内部Map 的值创建一个Set,并提供一个合并函数:

    final Map<String, Map<String, Set<String>>> scopesResponse = scopes.entrySet().stream().collect
        (Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
                .stream().collect(Collectors.toMap(s -> s.get(SCOPE_NM),
                                                   s -> {Set<String> set= new HashSet<>(); set.add(s.get(SCOPE_ID)); return set;},
                                                   (s1,s2)->{s1.addAll(s2);return s1;}))));
    

    或者,你可以用groupingBy构造内部Map

    final Map<String, Map<String, Set<String>>> scopesResponse2 = scopes.entrySet().stream().collect
        (Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
                .stream().collect(Collectors.groupingBy(s -> s.get(SCOPE_NM),
                                                   Collectors.mapping(s -> s.get(SCOPE_ID),Collectors.toSet())))));
    

    【讨论】:

      【解决方案2】:

      您也可以使用GuavaListMultimap 来实现(多映射就像列表的映射):

      Map<String, ListMultimap<String, String>> scopesResponse = scopes.entrySet().stream()
              .collect(Collectors.toMap(Map.Entry::getKey, e -> toMultimap(e)));
      

      在哪里

      static ImmutableListMultimap<String, String> toMultimap(
              Map.Entry<String, List<Map<String, String>>> entry) {
          return entry.getValue().stream().collect(ImmutableListMultimap.toImmutableListMultimap(
                  s -> (String) s.get(SCOPE_NM),
                  s -> (String) s.get(SCOPE_ID)
          ));
      }
      

      如果列表中的值重复,而您不希望这样,请改用SetMultimap

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多