Java Streams:如何将Stream<List<Integer>>转换为Stream<Integer>
问题描述
我要编写一个方法,接收Map<String, List<Integer>>类型参数和用于过滤的String类型参数name,返回类型为Stream<Integer>。目前我的实现返回的是Stream<List<Integer>>,需要将其转换为Stream<Integer>以遍历列表中的所有Integer元素。
示例Map:
Map<String, List<Integer>> person = Map.of( "John", List.of(54, 18), "Alex", List.of(28), "Tom", List.of(78, 42) );
当前代码实现:
return table.entrySet().stream() .filter(map -> map.getKey().equals(name)) .map(map -> map.getValue());
解决方案
你需要用flatMap替代map来完成从Stream<List<Integer>>到Stream<Integer>的转换。flatMap的作用是将每个列表中的元素“展开”为独立的流元素,最终合并成一个连续的Stream<Integer>。
修改后的代码如下:
return table.entrySet().stream() .filter(entry -> entry.getKey().equals(name)) .flatMap(entry -> entry.getValue().stream());
更高效的简化写法
由于Map的Key具有唯一性,无需遍历整个entrySet进行过滤,直接通过Key获取对应的List再转换为Stream即可,这种方式效率更高:
return table.getOrDefault(name, Collections.emptyList()).stream();
如果可以确定name对应的Key一定存在于Map中,也可以直接写:
return table.get(name).stream();
内容的提问来源于stack exchange,提问作者zzdhxu
相关产品推荐
相关产品推荐

