我有一个类定义如下
public class TimePeriodCalc {
private double occupancy;
private double efficiency;
private String atDate;
}
我想使用 Java 8 Stream API 执行以下 SQL 语句。
SELECT atDate, AVG(occupancy), AVG(efficiency)
FROM TimePeriodCalc
GROUP BY atDate
我试过 :
Collection<TimePeriodCalc> collector = result.stream().collect(groupingBy(p -> p.getAtDate(), ....
可以在代码中输入什么来选择多个属性?我正在考虑使用多个收集器,但真的不知道该怎么做。
无需定制即可完成Collector
(不再对结果进行流式传输),你可以这样做。它有点脏,因为它首先收集到Map<String, List<TimePeriodCalc>>
然后流式传输该列表并获得平均双倍。
由于您需要两个平均值,因此它们被收集到Holder
or a Pair
,在这种情况下我使用AbstractMap.SimpleEntry
Map<String, SimpleEntry<Double, Double>> map = Stream.of(new TimePeriodCalc(12d, 10d, "A"), new TimePeriodCalc(2d, 16d, "A"))
.collect(Collectors.groupingBy(TimePeriodCalc::getAtDate,
Collectors.collectingAndThen(Collectors.toList(), list -> {
double occupancy = list.stream().collect(
Collectors.averagingDouble(TimePeriodCalc::getOccupancy));
double efficiency = list.stream().collect(
Collectors.averagingDouble(TimePeriodCalc::getEfficiency));
return new AbstractMap.SimpleEntry<>(occupancy, efficiency);
})));
System.out.println(map);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)