2 回答

TA貢獻(xiàn)1871條經(jīng)驗 獲得超13個贊
像這樣的東西,我想。要查找組的平均數(shù):
Map<Long, Double> averages = samples.stream()
.collect(groupingBy(SensorSample::getTimestamp,
averagingDouble(SensorSample::getSample)));
我當(dāng)天沒有擴(kuò)展您的公式,我認(rèn)為如果我只是打電話getTimestamp并省略詳細(xì)信息,它會更具可讀性。如果您將getDay方法添加到SensorSample.
如果您提供了 MCVE,這也將更容易測試,因為只有一個部分類可以繼續(xù)測試上面的代碼有點困難。

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊
結(jié)果似乎您想要 aList<SensorSample>之后的每個組groupingBy都減少為單個SensorSample.
List<SensorSample> result = samples.stream()
.collect(groupingBy(sample -> SECONDS_IN_A_DAY*Math.floorDiv(sample.getTimestamp(), SECONDS_IN_A_DAY))
.entrySet()
.stream()
.map(e -> {
SensorSample sensorSample = new SensorSample();
sensorSample.setTimestamp(e.getKey());
double average = e.getValue().stream()
.mapToDouble(SensorSample::getSample)
.average().orElse(0);
sensorSample.setSample(average);
sensorSample.setSensorType(e.getValue().get(0).getSensorType());
return sensorSample;
}).collect(Collectors.toList());
map邏輯似乎有點大,因此我會考慮將其重構(gòu)為這樣的方法:
private static SensorSample apply(Map.Entry<Long, List<SensorSample>> e) {
SensorSample sensorSample = new SensorSample();
sensorSample.setTimestamp(e.getKey());
double average = e.getValue().stream()
.mapToDouble(SensorSample::getSample)
.average().orElse(0);
sensorSample.setSample(average);
sensorSample.setSensorType(e.getValue().get(0).getSensorType());
return sensorSample;
}
然后流管道將變?yōu)椋?/p>
List<SensorSample> result = samples.stream()
.collect(groupingBy(sample -> SECONDS_IN_A_DAY*Math.floorDiv(sample.getTimestamp(), SECONDS_IN_A_DAY))
.entrySet()
.stream()
.map(Main::apply)
.collect(Collectors.toList());
Main包含該apply方法的類在哪里。
添加回答
舉報