Java 使用收集器按两个字段分组
我有一个java对象记录:Java 使用收集器按两个字段分组,java,java-8,java-stream,collectors,Java,Java 8,Java Stream,Collectors,我有一个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; } 我将按记录的日期对记录列
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;
}
我将按记录的日期对记录列表进行分组,然后创建一个新记录,该记录将合并“金额”字段并返回一个映射:
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)));
我想按日期和类别对列表进行分组。因此,如果日期和类别相同,我希望将金额字段合并到一个新记录中,就像我已经在做的那样。我需要添加另一个Collectors.groupingBy子句,但语法一直不起作用。我相信返回类型将是Map。然后,我还需要将返回的映射转换为列表
我一直在尝试脱离这个示例您可以使用以下方法简化整个构造: 最后,要返回记录列表,不需要做比这更有趣的事情:
List<Record> result = new ArrayList<>(map.values());
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());