当前位置: 首页 > 知识库问答 >
问题:

分组Java8流而不收集它

寿丰
2023-03-14

在Java8中有什么方法可以在Java.util.stream.stream中分组元素而不收集它们吗?我希望结果再次成为。因为我必须处理大量的数据,甚至是无限的流,所以我不能首先收集数据,然后再次流化结果。

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

共有1个答案

卫开济
2023-03-14

没有办法使用标准的流API来做这件事。一般来说,您不能这样做,因为将来总是有可能出现属于任何已经创建的组的新项,所以在处理所有输入之前,您不能将组传递给下游分析。

但是,如果您事先知道要分组的项在输入流中总是相邻的,那么您可以使用增强流API的第三方库来解决这个问题。StreamEx就是这样一个库,它是免费的,由我编写。它包含许多“部分缩减”运算符,这些运算符基于某个谓词将相邻项折叠为单个项。通常,您应该提供bipredicate,它测试两个相邻的项,如果它们应该分组在一起,则返回true。以下列出了部分还原操作:

  • 折叠(双谓词):用组的第一个元素替换每个组。例如,collaph(objects::equals)对于从流中删除相邻的重复项非常有用。
  • groupruns(BiPredicate):用组元素列表替换每个组(因此streamex 转换为streamex > )。例如,stringstream.groupruns((a,b)->a.charat(0)==b.charat(0))将创建字符串列表流,其中每个列表包含以相同字母开头的相邻字符串。

其他部分约简操作包括intervalmaprunlengths()等。

所有的部分约简操作都是懒惰的,并行友好的,并且相当高效。

注意,您可以使用streamex.of(stream)从常规Java8流轻松地构造streamex对象。还有从数组、集合、读取器等构造它的方法。Streamex类实现Stream接口,并且与标准流API 100%兼容。

 类似资料:
  • 问题内容: Java 8中有什么方法可以将一个元素分组而不收集它们?我希望结果再次出现。因为我必须处理大量数据甚至是无限流,所以我无法先收集数据并再次流处理结果。 所有需要分组的元素在第一流中都是连续的。因此,我喜欢使流评估保持懒惰。 问题答案: 无法使用标准Stream API做到这一点。通常,您无法执行此操作,因为将来总是有可能出现属于任何已创建组的新项目,因此,在处理所有输入之前,您无法将组

  • 我有以下课程。 我希望能够按年龄分组,然后收集人名列表,而不是人名对象本身;所有这些都在一个漂亮的lamba表达式中。 为了简化所有这些,我链接了当前的解决方案,该解决方案存储按年龄分组的结果,然后迭代它以收集名称。 当前解决方案 不理想,为了学习,我想有一个更优雅、更高效的解决方案。

  • 我有一个订单列表,我想使用Java8Stream和Collectors按用户分组。GroupingBy: 这将返回包含用户和订单列表的映射: 我不需要整个对象User,只需要它的username字段,它是一个字符串,所以我想获得如下内容: 我试图使用stream.map将用户映射到username字段,但无法正确实现。我怎样才能尽可能简单地做到这一点呢?

  • 我正在使用我有一个类,如下所示: 现在我想做的是: 筛选出senderId无效的记录(使用映射) 下面是我的代码: 这给我带来了一个错误: 错误:(105,90)java:找不到适用于groupingBy(共享[…]的方法gMode,java。util。作用函数)方法java。util。流动收藏家。groupingBy(java.util.function.function)不适用(无法推断类型变

  • 我在流中使用分组: 1:我想知道如何在Collect方法中使用“Grouping By”两次。 2:其次,在分组中定义退货类型的策略是什么? 1: 错误消息: 1:线程“main”java中出现异常。RuntimeException:不可编译的源代码-不兼容的类型:推理变量D具有不兼容的等式约束。字符串,java。lang.Integer在collectorsinjava。收藏家辛加瓦。main(