首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分组Java8流而不收集它

分组Java8流而不收集它
EN

Stack Overflow用户
提问于 2016-08-18 08:33:40
回答 1查看 10.3K关注 0票数 47

在Java 8中是否有任何方法可以在不收集元素的情况下对java.util.stream.Stream中的元素进行分组?我希望结果再次成为一个Stream。因为我必须处理大量的数据,甚至是无限流,所以我不能先收集数据,然后再流结果。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-18 08:56:34

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

但是,如果预先知道要分组的项在输入流中总是相邻的,则可以使用第三方库增强stream来解决问题。其中一个类库是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轻松地从常规Java8流构造一个StreamEx.of(stream)对象。此外,还有一些方法可以从数组、集合、阅读器等方面构建它。StreamEx类实现了Stream接口,并且100%与标准的Stream兼容。

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39013437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档