我正在尝试使用 Java 8 流创建单个 CarData 对象,该对象由列表中所有 CarData 字段的平均值组成getCars
;
CarData = new CarData();
CarData.getBodyWeight returns Integer
CarData.getShellWeight returns Integer
List<CarData> carData = carResults.getCars();
IntSummaryStatistics averageBodyWeight = carData.stream()
.mapToInt((x) -> x.getBodyWeight())
.summaryStatistics();
averageBodyWeight.getAverage();
IntSummaryStatistics averageShellWeight = carData.stream()
.mapToInt((x) -> x.getShellWeight())
.summaryStatistics();
getShellWeight.getAverage();
我不想在最终返回的结果中将这些内容重新组合在一起。
从视觉上看,这是我的清单
getCars() : [
{CarData: { getBodyWeight=10, getShellWeight=3 } }
{CarData: { getBodyWeight=6, getShellWeight=5 } }
{CarData: { getBodyWeight=8, getShellWeight=19 } }
]
我想要实现的输出是一个单个对象,它具有我指定的每个字段的平均值。不确定我是否需要使用Collectors.averagingInt
或 IntSummaryStatistics 的某些组合来实现此目的。对于这些技术中的任何一种,都可以轻松地跨一个字段执行操作,只是不确定在使用多个整数字段时缺少什么。
{CarData: { getBodyWeight=8, getShellWeight=9 } }
从 JDK 12 开始,您可以使用以下解决方案:
CarData average = carData.stream().collect(Collectors.teeing(
Collectors.averagingInt(CarData::getBodyWeight),
Collectors.averagingInt(CarData::getShellWeight),
(avgBody, avgShell) -> new CarData(avgBody.intValue(), avgShell.intValue())));
对于较旧的 Java 版本,您可以执行以下任一操作:添加teeing
实施这个答案到您的代码库并完全按照上面的方式使用它,或者创建一个适合您的任务的自定义收集器,如下所示安德烈亚斯的回答.
或者考虑在一个时间段内流式传输两次List
在内存中并不一定比在一个流中执行两个操作更糟糕,无论是可读性还是性能方面。
请注意,调用intValue()
on Double
对象具有相同的行为(int)
投射安德烈亚斯的答案。因此,无论哪种情况,如果需要其他舍入行为,您都必须调整代码。
或者您考虑使用不同的结果对象,能够保存两个浮点值的平均值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)