【发布时间】:2019-04-12 08:47:04
【问题描述】:
我有非常大的版本化文档流,按文档 ID 和版本排序。
例如Av1、Av2、Bv1、Cv1、Cv2
我必须将其转换为另一个流,其记录按文档 ID 聚合。
A[v1, v2], B[v1], C[v1, V2]
不使用Collectors.groupBy() 可以做到这一点吗?我不想使用groupBy(),因为它会在对流中的所有项目进行分组之前将它们加载到内存中。理论上,不需要将整个流加载到内存中,因为它是有序的。
【问题讨论】:
-
您能否更清楚地说明该语句.. 因为它会在分组之前将流中的所有项目加载到内存中?
-
流管道默认是惰性的。它们按需加载数据,这对于开发低内存占用的代码很有用。因此,人们可以一次处理一个项目,而无需将所有项目都保存在内存中。但是对于像 groupBy 这样的操作,必须消耗流中的所有项目才能构建结果。有意义吗?
-
我认为您正在寻找
StreamEx.groupRuns的功能:amaembo.github.io/streamex/javadoc/one/util/streamex/… -
当您将
groupingBy(Function,Collector)与下游收集器一起使用时聚合到不引用单个元素的结果,这些元素不会保存在内存中。关键是你想对结果流做什么。显然,您假设后续操作不需要内存中保存的所有内容。然后,只需在第一个collect操作中执行此操作即可。 -
@millimoose 你的建议非常适合我。您想将其发布为答案吗?
标签: java java-stream collectors