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

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

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

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

 Map map = documents.stream().collect(Collectors.groupingBy(Document::getAuthor, Collectors.summingInt(Document::getPageCount))); 

groupingBy方法将为您提供Map> 。 现在,您必须使用下游收集器来汇总与每个键关联的List中每个文档的所有页数。

这是通过向groupingBy提供下游收集器来完成的,它是summingInt ,从而产生Map


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

我认为他们删除了这个操作并创建了Collectors类,而不是有一个有用的类,它包含了一些常用的减少。

假设我们有一份员工名单,包括他们的部门和薪水,我们想要每个部门支付的总薪水。

有几种方法可以做到这一点,你可以使用toMap收集器来聚合每个部门的数据:

  • 第一个参数是关键映射器(您的聚合轴=部门),
  • 第二个是值映射器(要聚合的数据=工资),以及
  • 第三个是合并function(如何聚合数据=对值进行求和)。

例:

 import static java.util.stream.Collectors.*; public static void main(String[] args) { List persons = Arrays.asList(new Person("John", "Sales", 10000), new Person("Helena", "Sales", 10000), new Person("Somebody", "Marketing", 15000)); Map salaryByDepartment = persons.stream() .collect(toMap(Person::department, Person::salary, (s1, s2) -> s1 + s2)); System.out.println("salary by department = " + salaryByDepartment); } 

与流一样,有几种方法可以获得所需的结果,例如:

 import static java.util.stream.Collectors.*; Map salaryByDepartment = persons.stream() .collect(groupingBy(Person::department, summingDouble(Person::salary))); 

供参考,Person类:

 static class Person { private final String name, department; private final double salary; public Person(String name, String department, double salary) { this.name = name; this.department = department; this.salary = salary; } public String name() { return name; } public String department() { return department; } public double salary() { return salary; } } 

这个特殊的Javadoc条目是关于Java 8中这个聚合的最接近的东西。即使它是第三方API,签名似乎很好 – 你提供了一些函数来获取值,一些终端函数对于值(在这种情况下为零),以及一些将函数和值组合在一起的函数。

它感觉很像收集器 ,它将为我们提供这样做的能力。

 Map strIntMap = intList.stream() .collect(Collectors .groupingBy(Document::getAuthor, Collectors.summingInt(Document::getPageCount))); 

接下来的想法是,我们将列表中每个条目的作者姓名分组,并将作者的总页码加到Map