デブ:
私はのリストを持っていますRecords
。これは2つのフィールドがあります。LocalDateTime instant
とDouble data
。
私は時間単位ですべてのレコードGROUPBYにしたいと作成しますMap<Integer, Double>
。その時の最初のデータ-どこキー(整数)は、その時の時間と値(ダブル)されている最後のデータです。
私がこれまで行ってきたことは、次のとおりです。
Function<Record, Integer> keyFunc = rec->rec.getInstant().getHour();
Map<Integer, List<Record>> valueMap = records.stream().collect(Collectors.groupingBy(keyFunc));
私は、値マップを保持したいDouble
の代わりにList<Records>
。
たとえば、次のリストのレコードは、次のことができます。
Instant Data
01:01:24 23.7
01:02:34 24.2
01:05:23 30.2
...
01:59:27 50.2
02:03:23 54.4
02:04:23 56.3
...
02:58:23 70.3
...
等
結果のマップは次のようになります。
Key Value
1 26.5 (50.2-23.7)
2 15.9 (70.3-54.4)
...
また:
あなたは、主に探しているCollectors.mapping
内にgroupingBy
。
Map<Integer, List<Double>> valueMap = records.stream()
.collect(Collectors.groupingBy(keyFunc,
Collectors.mapping(Record::getData, Collectors.toList())));
これは、グループ希望Record
のそれらによってinstant
の時間とに、そのようなレコードのデータに対応するList
マップの値として。さらにコメントに基づいて
私は最後のデータから最初のデータを減算したいです
はいリストは、インスタントに基づいてリストをソートします
あなたは、所望の出力などを取得するためにグループ化されたマップを使用することができます。
Map<Integer, Double> output = new HashMap<>();
valueMap.forEach((k, v) -> output.put(k, v.get(v.size() - 1) - v.get(0)));
また、あなたが使用することができCollectors.mapping
てCollectors.collectingAndThen
、さらにとして:
Map<Integer, Double> valueMap = records.stream()
.collect(Collectors.groupingBy(keyFunc,
Collectors.mapping(Record::getData,
Collectors.collectingAndThen(
Collectors.toList(), recs -> recs.get(recs.size() - 1) - recs.get(0)))));