2 回答
TA贡献1871条经验 获得超13个赞
像这样的东西,我想。要查找组的平均数:
Map<Long, Double> averages = samples.stream()
.collect(groupingBy(SensorSample::getTimestamp,
averagingDouble(SensorSample::getSample)));
我当天没有扩展您的公式,我认为如果我只是打电话getTimestamp并省略详细信息,它会更具可读性。如果您将getDay方法添加到SensorSample.
如果您提供了 MCVE,这也将更容易测试,因为只有一个部分类可以继续测试上面的代码有点困难。
TA贡献1775条经验 获得超8个赞
结果似乎您想要 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逻辑似乎有点大,因此我会考虑将其重构为这样的方法:
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;
}
然后流管道将变为:
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方法的类在哪里。
添加回答
举报
