你能帮我合并几张地图的价值吗?

Pav*_*vel 4 java hashmap java-8 java-stream collectors

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

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))))
        );
Run Code Online (Sandbox Code Playgroud)

但我面临"Duplicate key"错误,所以我想scopeResponses改为Map<String, Map<String, List<String>>>

你能告诉我如何将值合并s -> (String) s.get(SCOPE_ID)到一个ListSet在这种情况下?

Era*_*ran 5

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

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;}))));
Run Code Online (Sandbox Code Playgroud)

或者,你可以构造内MapgroupingBy:

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())))));
Run Code Online (Sandbox Code Playgroud)