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

Java 8分组成Peek

牟恺
2023-03-14

我最近了解了Java8中的流,并开始使用它们。现在我有一个关于groupingby收集器方法的问题:

我通常使用。NET,所以我将JavaStream 与。NETIEnumerable 进行了比较(知道它们不一样)。在此比较之后,列表 存储元素,而特定的/IEnumerable应用操作。一个例子:

C#:

elements.Where(x => x.Value == 5).ToList();
elements.stream().filter(x -> x.getValue() == 5).collect(Collectors.toList());
data.stream()
    .map( ... ).filter( ... ) // Some operations
    .collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)));

这个查询的结果是一个映射 ,我可以处理它,但是假设我想继续处理这个数据,而不是存储它。我目前的方法很琐碎:

    ...
    .collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)))
    .entrySet().stream().
    .map( ... ) // Do more operations

但是通过这种方式,我离开流,将第一个结果存储在一个映射中,并打开一个新的流继续。有没有一种方法可以在没有收集器的情况下进行分组,这样我就可以“停留”在流中?

共有1个答案

魏冷勋
2023-03-14

只要可以将操作描述为收集器,您就可以在下游收集器中做任何您喜欢做的事情。目前,只有与中间操作map等效的mapping收集器,但是Java9还将添加filteringflatmapping(您也可以在Java8中自行实现),并且几乎每个终端操作都有等效的操作。

当然,一个嵌套的收集器设备将看起来完全不同于一个流操作链做同样的…

但是,如果要处理完整的组,则没有办法先完成grouping集合。这不是API的限制,而是分组操作或任何一般操作的固有特性,如果您想要处理一个完整的结果,您需要首先完成该操作。不管API看起来如何(例如,您可以在收集器中以收集然后类似的方式隐藏后续操作),创建和填充映射是不可避免的,因为它是负责维护组的映射。这些组由map的键和查找逻辑确定,因此,例如,将sortedmap自定义比较器一起使用,或者将identityHashmap一起使用,可以完全更改分组逻辑。

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

  • 问题内容: 我想在下面学习给定语句的时间复杂度。(在Java8中) 任何想法? 问题答案: 由于时间复杂度取决于所有操作,因此没有通用的答案。由于必须完全处理流,因此必须将其基本时间复杂度乘以每个元素完成的所有操作的成本。假设迭代成本本身并不比差,大多数流源就是这种情况。 因此,假设没有影响时间复杂度的中间操作,则必须评估每个元素的功能,该功能应独立于其他元素,因此不影响时间复杂度(无论它有多昂贵

  • 我正在使用我有一个类,如下所示: 现在我想做的是: 筛选出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(

  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

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

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

  • 给定以下类的,使用Java 8 lambda,我希望获得的,每个帐户类型一个。 到目前为止,我使用以下代码按对进行分组。 如何返回,将列表从每个映射键传递到构造函数中,其中包含每个中的一个?