カスタムロジックを使用してJava 8ストリームgroupingBy

デブ:

私はのリストを持っていますRecordsこれは2つのフィールドがあります。LocalDateTime instantDouble 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.mappingCollectors.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)))));

おすすめ

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