コレクターを使用して、2つのフィールドによってグループ

Drew13:

私は、Javaオブジェクトのレコードを持っています:

public Record(ZonedDateTime day, int ptid, String name, String category, int amount) {
        this.day= day;
        this.id= id;
        this.name = name;
        this.category = category;
        this.amount = amount;
}

私はリストグループ化していますRecord自分でSをday、してから、新しい作成Record組み合わせたamountフィールドを、マップを返します:

Map<ZonedDateTime, Record> map = tempList.stream().collect(Collectors.groupingBy(Record::getDay,
                Collectors.collectingAndThen(
                        Collectors.reducing((r1, r2) -> new Record(r1.getDay(),Integer.toString(r1.getId),r1.getName(),
                                r1.getCategory(),r1.getAmount() + r2.getAmount())),
                        Optional::get)));

私はグループにリストしたいdayとしcategoryもしそうならばdaycategory同じですが、私は結合したいと思いますamount新しいフィールドをRecord私はすでにやっているように。私は別で追加する必要があるCollectors.groupingBy句が、構文は、単に仕事をしていません。私は、戻り値の型があることと考えていますMap<ZonedDateTime, Map<String, List<Record>>>私はまた、その後に返されたマップを変換する必要がありますList

私は、この例のオフに行くしようとしてきたJavaで複数のフィールド名によるグループ8

フェデリコ・ペラルタシャフナー:

あなたは使用して全体の構造を簡素化することができCollectors.toMap

Map<List<Object>, Record> map = tempList.stream()
        .collect(Collectors.toMap(
                            r -> List.of(r.getDay(), r.getCategory()), // or Arrays.asList
                            Record::new,
                            Record::merge));

トリックは、複合キーでグループにあります。この場合、我々は、使用しているList<Object>の両方を持つRecord.dayとしRecord.categoryList実装Object.hashCodeおよびObject.equals必要に応じて、それは安全に任意のキーとして使用することができますMap)。

仕事への削減のために、我々はコピーコンストラクタと必要なmergeメソッドを:

public Record(Record r) {
    this(r.day, r.name, r.name, r.category, r.amount);
}

public Record merge(Record r) {
    this.amount += r.amount;
    return this;
}

最後に、レコードのリストを返すために、これよりも手の込んだ何もする必要はありません。

List<Record> result = new ArrayList<>(map.values());

おすすめ

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