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
。もしそうならばday
とcategory
同じですが、私は結合したいと思います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.category
。(List
実装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());