流Java 8 api中是否有aggregateBy方法?

Mr_*_*s_D 14 java aggregation java-8

浏览Brian Goetz 这个非常有趣但却有一年历史的演示文稿 - 在幻灯片链接中他提出了一个aggregateBy()假设在Stream API中的方法,该方法应该将列表(?)的元素聚合到一个映射(给定一个默认的初始值)以及操作该值的方法(对于重复键也是如此) - 请参阅演示文稿中的下一张幻灯片).

显然,Stream API中没有这样的方法.还有另一种方法可以在Java 8中做类似的事情吗?

Ale*_* C. 14

可以使用Collectors类完成聚合操作.所以在视频中,示例相当于:

Map<String, Integer> map = 
    documents.stream().collect(Collectors.groupingBy(Document::getAuthor, Collectors.summingInt(Document::getPageCount)));
Run Code Online (Sandbox Code Playgroud)

该groupingBy方法会给你一个Map<String, List<Document>>.现在,您必须使用下游收集器来汇总List与每个键关联的每个文档的所有页数.

这是通过提供下游收集器来完成的groupingBy,这summingInt导致了a Map<String, Integer>.


他们在文档中给出了基本相同的例子,他们根据部门计算员工工资的总和.

我认为他们删除了这个操作并创建了这个Collectors类,而不是让一个有用的类包含很多通常会使用的减少.

  • 是的,aggregateBy()是对Collector中现在体现的概念的早期尝试.(虽然我认为引用的例子已经超过一年了.)使用Collector解决的aggregateBy()的一个问题是它只是"一层深".Collectors.groupingBy()通过"下游"收集器解决这个问题,并且更具可组合性. (8认同)