マルチェロ:
私はSensorSampleのPOJOのリストを持っています
public class SensorSample {
private Device.SensorType sensorType; // This is an enum
private double sample;
private long timestamp;
// Constructor
// Setters
// Getters
}
私は、グループにそれらを必要とするtimestamp
ため、すべてのことをSensorSample
同じ日のsが一緒にされています。それから私は、私は一つだけ持っているので、それらを削減する必要があるSensorSample
毎日のために、その値がsample
の値の平均であるsample
その日のすべてのオブジェクトのを。ストリームとそれを行う方法はありますか?
これまでのところ私はグループ一緒にこれを得ました:
Map<Long, List<SensorSample>> yearSamples = samples.stream()
.collect(groupingBy(sample -> SECONDS_IN_A_DAY*Math.floorDiv(sample.getTimestamp(), SECONDS_IN_A_DAY)));
しかし、私はそれ以上に行くのか分かりません。
Ousmane D .:
あなたがしたいかのように思えるList<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
方法が。