Kha*_*yễn 9 java java-8 java-stream
我有一个类定义的类
public class TimePeriodCalc {
private double occupancy;
private double efficiency;
private String atDate;
}
Run Code Online (Sandbox Code Playgroud)
我想使用Java 8 Stream API执行以下SQL语句.
SELECT atDate, AVG(occupancy), AVG(efficiency)
FROM TimePeriodCalc
GROUP BY atDate
Run Code Online (Sandbox Code Playgroud)
我试过了 :
Collection<TimePeriodCalc> collector = result.stream().collect(groupingBy(p -> p.getAtDate(), ....
Run Code Online (Sandbox Code Playgroud)
可以在代码中添加什么来选择多个属性?我正在考虑使用多个收集器,但实际上不知道如何操作.
要做到这一点没有自定义Collector(不再在结果上流式传输),你可以这样做.它有点脏,因为它首先收集Map<String, List<TimePeriodCalc>>然后流式传输该列表并获得平均加倍.
由于你需要两个平均值,它们被收集到a Holder或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);
Run Code Online (Sandbox Code Playgroud)