代码对比
✕ Java 8
// Flatten within a grouping collector
// Required complex custom collector
Map<String, Set<String>> tagsByDept =
// no clean way in Java 8
✓ Java 9+
var tagsByDept = employees.stream()
.collect(groupingBy(
Emp::dept,
flatMapping(
e -> e.tags().stream(),
toSet()
)
));
发现此代码有问题? 告诉我们。
为什么现代方式更好
可组合
作为 groupingBy 内的下游收集器使用。
更扁平
避免嵌套的 stream-inside-collector 模式。
表达性强
flatMapping 的意图一目了然。
旧方式
嵌套 flatMap
现代方式
flatMapping()
自 JDK
9
难度
中级
JDK 支持
Collectors.flatMapping()
可用
自 JDK 9 起广泛可用(2017 年 9 月)
工作原理
Collectors.flatMapping() 在 groupingBy 等收集器内部将一对多映射作为下游收集器应用。这避免了 groupingBy 和 flatMap 的笨拙嵌套。
相关文档