在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_java – 使用Collectors.groupingBy创建复杂对象》对你有帮助,请点赞、收藏,并留下你的观点哦!