【问题标题】:From Map<String, Set<Integer>> collect values from a Set<String> of keys从 Map<String, Set<Integer>> 从 Set<String> 的键中收集值
【发布时间】:2020-06-05 19:03:43
【问题描述】:

我正在尝试使用映射将一组键映射到字符串映射到整数集。理想情况下,我想获取所有值集并将它们收集到一个集合中。

假设我有:

Map<String, List<Integer>> keyValueMap = new HashMap<>();
Set<String> keys = new HashSet<>();
Set<String> result = new HashSet<>();

我试过了:

result.addAll(keys.stream().map(key -> keyValueMap.get(key)).collect(Collectors.toSet());

这给我带来了一个错误,说 addAll() 不适用于 Set> 类型。我尝试用 flatMap() 替换 map(),但如果这是解决方案,我似乎无法获得正确的语法。

实现这项工作的正确语法是什么?

谢谢!

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    看起来result 的类型应该是Set&lt;Integer&gt; 而不是Set&lt;String&gt;


    使用您的 sn-p,您尝试在 Set&lt;Integer&gt; 上调用 Set#addAll,但传递的参数是 Set&lt;List&lt;Integer&gt;&gt;,它无法编译。

    为了改善您的问题,一种解决方案是使用flatMap 而不是map

    result.addAll(keys.stream()
                      .flatMap(key -> keyValueMap.get(key).stream())
                      .collect(Collectors.toSet()));
    

    一个逻辑上等价的sn-p是:

    result.addAll(keys.stream()
                      .map(keyValueMap::get)
                      .flatMap(List::stream)
                      .collect(Collectors.toSet()));
    

    另一个解决方案是使用Map#values:

    result.addAll(keyValueMap.values().stream()
                             .flatMap(List::stream)
                             .collect(Collectors.toSet()));
    

    【讨论】:

    • @TimB。改善,意思是让事情变得更好。在这种情况下,它指的是修复您的编译器错误。如果我是你,我会利用 Map#keySetMap#values
    • @TimB。查看documentationMap。它有许多可能适合您的用例的方法。
    • 我的用例实际上比我上面的问题复杂得多,所以我不太确定有没有更好的方法来利用 Map#keySet 和 Map#values,但我会再读一读通过文档并查看。
    • 完美,谢谢!由于某种原因,第二个解决方案对我来说无法编译,所以我只坚持第一个。
    • 不需要addAll。只需将collect 操作的结果分配给result,例如Set&lt;Integer&gt; result = keys.stream() .flatMap(key -&gt; getOrDefault(key, Collections.emptyList()).stream()) .collect(Collectors.toSet());
    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 2021-04-26
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多