无法使用标准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))
将创建字符串列表流,其中每个列表包含以相同字母开头的相邻字符串。
其他部分归约运算包括
intervalMap,
runLengths()等等。
所有部分还原操作都是惰性的,并行友好的并且非常有效。
请注意,您可以使用轻松
StreamEx从常规Java
8流构造对象
StreamEx.of(stream)。也有一些方法可以从数组,集合,读取器等构造它。
StreamEx该类实现
Stream接口,并且100%与标准Stream
API兼容。



