gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:02 27 4
gpt4 key购买 nike

我定义了一个类

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 中或 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);

关于java - Java 8 Stream API 中的多个聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44942493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com