为啥不在 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 【参考方案1】:

减少方法有什么缺点或问题吗? 从小数据负载的技术角度来看并非如此。

但是,对于大多数人来说,阅读使用 reduce(更少使用流操作)的版本会更难。

这将使阅读、理解和更改代码变得更加困难。 除此之外没有区别,除非您正在处理的数据负载是巨大的!

然后,可以证明其中一个实现比另一个实现更高性能。您需要通过使用 JUnit 的负载测试来涵盖这两种实现并查看性能。

【讨论】:

以上是关于为啥不在 Stream API 中使用 reduce 来合并多个映射?的主要内容,如果未能解决你的问题,请参考以下文章

[java]Stream API——reduce

Stream api reduce方法在尝试对大数求和时返回负值[重复]

Java8 中reduce的基本使用

流上的 reduce() 操作似乎正在修改数据源(列表)Stream API Java 8

stream reduce 执行源码简易分析

为啥颤振 API 响应正文不在控制台中打印?