【发布时间】:2018-09-27 10:05:51
【问题描述】:
带有流的Oracle trails on reduction 提供了一个示例,说明如何将一组人转换为包含基于性别的平均年龄的地图。它使用以下Person 类和代码:
public class Person {
private int age;
public enum Sex {
MALE,
FEMALE
}
private Sex sex;
public Person (int age, Sex sex) {
this.age = age;
this.sex = sex;
}
public int getAge() { return this.age; }
public Sex getSex() { return this.sex; }
}
Map<Person.Sex, Double> averageAgeByGender = roster
.stream()
.collect(
Collectors.groupingBy(
Person::getSex,
Collectors.averagingInt(Person::getAge)));
上面的流代码效果很好,但我想看看如何在使用收集器的自定义实现时执行相同的操作。我在 Stack Overflow 或网络上都找不到完整的示例。至于我们为什么要这样做,例如,也许我们想要计算某种涉及年龄的加权平均值。在这种情况下,Collectors.averagingInt 的默认行为是不够的。
【问题讨论】:
-
不确定在这种情况下是否有帮助,但也有
Collectors.summarizingInt,它返回一个IntSummaryStatistics,当Collectors.averagingInt不够用时很有帮助。 -
@kapex 这很有帮助,但我的目的是为罐装收集器不满足需求的情况提供一些可用的样板代码。
标签: java lambda java-stream collectors