分组Java8流而不收集它

问题描述

无法使用标准Stream API做到这一点。通常,您无法执行此操作,因为将来总是有可能出现属于任何已创建组的新项目,因此,在处理所有输入之前,您无法将组传递给下游分析。

但是,如果您事先知道要分组的项目在输入流中始终是相邻的,则可以使用增强Stream API的第三方库来解决您的问题。StreamEx是此类库之一,它是我免费写的。它包含许多“部分归约”运算符,这些运算符根据某些谓词将相邻项折叠为单个。通常,您应该提供一个BiPredicate测试两个相邻项目的项目,如果将它们组合在一起,则返回true。下面列出了一些部分归约操作:

  • collapse(BiPredicate):将每个组替换为该组的第一个元素。例如,collapse(Objects::equals)对于从流中删除相邻重复项很有用。
  • groupRuns(BiPredicate):用组元素列表替换每个组(因此StreamEx<T>被转换为StreamEx<List<T>>)。例如,stringStream.groupRuns((a, b) -> a.charat(0) == b.charat(0))将创建字符串列表流,其中每个列表包含以相同字母开头的相邻字符串。

其他部分归约运算包括intervalMaprunLengths()等等。

所有部分还原操作都是惰性的,并行友好的并且非常有效。

请注意,您可以使用轻松StreamEx从常规Java 8流构造对象StreamEx.of(stream)。也有一些方法可以从数组,集合,读取器等构造它。StreamEx该类实现Stream接口,并且100%与标准Stream API兼容。

解决方法

Java
8中有什么方法可以将一个元素分组java.util.stream.Stream而不收集它们?我希望结果Stream再次出现。因为我必须处理大量数据甚至是无限流,所以我无法先收集数据并再次流处理结果。

所有需要分组的元素在第一流中都是连续的。因此,我喜欢使流评估保持懒惰。