Java将列表组的字段(BigDecimal)和2个字段相加

Java将列表组的字段(BigDecimal)和2个字段相加,java,java-stream,Java,Java Stream,我有一份清单: public class Dto { private Integer id; private String text; private BigDecimal price; } 我试过: Map<String, Map<Integer, List<Dto>>> map = list.stream() .collect( C

我有一份清单:

public class Dto {
    private Integer id;
    private String text;
    private BigDecimal price;
}
我试过:

 Map<String, Map<Integer, List<Dto>>> map =
            list.stream()
                .collect(
                     Collectors.groupingBy(
                     Dto::getText,
                     Collectors.groupingBy(Dto::getId)));
地图=
list.stream()
.收集(
收集者分组(
Dto::getText,
Collectors.groupingBy(Dto::getId));
但这并没有给出BigDecimal字段的和

此外,我希望有如下回报结构:

List<SumDto>

public class SumDto {
      private Integer id;
      private String text;
      private BigDecimal sum;
}
列表
公共级萨姆托{
私有整数id;
私有字符串文本;
私有大十进制和;
}

我怎样才能做到这一点?非常感谢

您没有求和,这就是为什么您在任何地方都看不到求和。您必须告诉收集器。groupingBy如何减少下游元素。否则,默认情况下会创建一个
列表

这就是你可以做到的:

Map<String, Map<Integer, BigDecimal>> map = list.stream()
    .collect(Collectors.groupingBy(
             Dto::getText, 
             Collectors.groupingBy(
                        Dto::getId, 
                        Collectors.reducing(
                                   BigDecimal.ZERO,
                                   Dto::getPrice, 
                                   BigDecimal::add))));
Map Map=list.stream()
.collect(收集器.groupingBy(
Dto::getText,
收集者分组(
Dto::getId,
还原剂(
BigDecimal.ZERO,
Dto::getPrice,
BigDecimal::add));

至于回报结构,我将把它作为练习;)

我原以为嵌套映射的最终值应该是
SumDto
的一个实例(显然不是任何东西的列表),即使它包含冗余信息。