Java 8 Stream API中的多个聚合函数

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)

可以在代码中添加什么来选择多个属性?我正在考虑使用多个收集器,但实际上不知道如何操作.

Eug*_*ene 5

要做到这一点没有自定义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)