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; } 我将按记录的日期对记录列

我有一个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;
}
我将按记录的日期对记录列表进行分组,然后创建一个新记录,该记录将合并“金额”字段并返回一个映射:

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());