为啥不在 Stream API 中使用 reduce 来合并多个映射?
Posted
技术标签:
【中文标题】为啥不在 Stream API 中使用 reduce 来合并多个映射?【英文标题】:Why not use reduce in Stream API to merge multiple maps?为什么不在 Stream API 中使用 reduce 来合并多个映射? 【发布时间】:2021-11-19 09:11:00 【问题描述】:在查看了关于如何在流中合并地图的几个答案之后,似乎到目前为止所有的答案都建议使用“扁平化和收集”方法:
Map<String, Double> outMap =
myCol.stream()
.flatMap(m -> m.entrySet().stream())
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue, Double::sum));
但为什么不使用归约来合并:
Map<String, Double> outMap =
myCol.stream()
.reduce((r, r1) ->
r1.forEach((k, v) -> r.merge(k, v, Double::sum))
.orElseThrow(()->Exception());
减少方法有什么缺点或问题吗?
【问题讨论】:
不管你喜欢什么,如果它有效的话。 通常reduce操作是不可变的。另一方面,收集器可能会产生副作用并改变您的数据。myCol
的类型是什么?
@SamuelTeixeira 为简单起见,我们假设 myCol 的类型也是 Map减少方法有什么缺点或问题吗? 从小数据负载的技术角度来看并非如此。
但是,对于大多数人来说,阅读使用 reduce(更少使用流操作)的版本会更难。
这将使阅读、理解和更改代码变得更加困难。 除此之外没有区别,除非您正在处理的数据负载是巨大的!
然后,可以证明其中一个实现比另一个实现更高性能。您需要通过使用 JUnit 的负载测试来涵盖这两种实现并查看性能。
【讨论】:
以上是关于为啥不在 Stream API 中使用 reduce 来合并多个映射?的主要内容,如果未能解决你的问题,请参考以下文章
Stream api reduce方法在尝试对大数求和时返回负值[重复]