当前位置: 首页 > 面试题库 >

分组Java8流而不收集它

商畅
2023-03-14
问题内容

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

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


问题答案:

无法使用标准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兼容。



 类似资料:
  • 在Java8中有什么方法可以在中分组元素而不收集它们吗?我希望结果再次成为。因为我必须处理大量的数据,甚至是无限的流,所以我不能首先收集数据,然后再次流化结果。 所有需要分组的元素在第一个流中是连续的。因此,我喜欢保持流评估懒惰。

  • 我有以下课程。 我希望能够按年龄分组,然后收集人名列表,而不是人名对象本身;所有这些都在一个漂亮的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(