java grouping_java – 使用Collectors.groupingBy创建复杂对象

在oracle’s reduction tutorial中,可以使用Stream.collect计算流中的平均年龄:

Averager averageCollect = roster.stream()

.filter(p -> p.getGender() == Person.Sex.MALE)

.map(Person::getAge)

.collect(Averager::new, Averager::accept, Averager::combine);

但是如果想要创建Map< Person.Sex,Averager>使用lambda groupingBy,而不是简单的平均值,如教程结尾所示:

Map totalAgeByGender =

roster

.stream()

.collect(

Collectors.groupingBy(

Person::getGender,

Collectors.reducing(

0,

Person::getAge,

Integer::sum)));

解决方法:

是的,这有点微妙.要更改映射中的值,您必须更改groupingBy调用的下游收集器.在这种情况下,您必须应用嵌套的下游收集器.

流开始于人,我们希望Averagers作为地图的值.要从Person到Averager,我们首先需要将每个Person映射到它们的年龄(一个int),然后将整数提供给Averager.

我们首先对性别进行分组,因此需要处理与每个性别相对应的人员.下一步是使用映射收集器作为groupingBy的下游收集器将人员映射到他们的年龄.

现在你有了年龄,你想为每个组创建Averager实例.本教程中的Averager类已经有了收集器方法 – 它支持供应商

你可能感兴趣的:(java,grouping)