要在沒有自定義收集器的情況下執行此操作(不再對結果進行流式傳輸),您可以這樣做.它有點臟,因為它首先收集到Map< String,List< TimePeriodCalc>>然后流式傳輸該列表并獲得平均加倍.
由于你需要兩個平均值,它們被收集到一個Holder或一對,在這種情況下我使用的是AbstractMap.SimpleEntry
Map> 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);