属性によってグループ化するオブジェクトの一覧をJavaストリームを使用し、別の属性の平均でオブジェクトの新しいリストにそれらを減らします

マルチェロ:

私は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方法が。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=209589&siteId=1