Java Streams - 如果其他字段匹配,如何对值求和

问题描述 投票:0回答:1

我有一个对象列表,例如:

Part("12345" , "Part1", 5));
Part("67890" , "Part5", 2));
Part("12345" , "Part1", 2));

我希望能够转换为下面的列表,如果零件编号出现一次且数量相加。

结果

Part("12345" , "Part1", 7));
Part("67890" , "Part5", 2));

return emptyIfNull(partList.getParts())
           .stream()
            .map(part -> Part
                    .builder()
                    .partNumber(part.getNumber())
                    .partDescription(part.getDescription())
                    .partQuantity(part.getQuantity()) // WHAT CHANGE DO I NEED TO MAKE TO FILTER AND SUM
                    .build())
            .collect(toList());
java java-stream
1个回答
0
投票

考虑值

Part
表示如下:

record Part(String number, String description, int quantity) {
    private Part merge(Part another) {
        return new Part(this.number, this.description,
                this.quantity + another.quantity);
    }
}

您可以使用 toMap 收集器收集

merged
值的列表,例如:

Collection<Part> mergedValues = emptyIfNull(partList.getParts())
        .stream()
        .collect(Collectors.toMap(p -> p.number, 
                Function.identity(), Part::merge))
        .values();
© www.soinside.com 2019 - 2024. All rights reserved.