Java中对象列表映射中的BigDecimal求和

Java中对象列表映射中的BigDecimal求和,java,java-stream,bigdecimal,Java,Java Stream,Bigdecimal,我一直在用一些优雅的方法在地图中求出BigDecimals的总和。我知道如何计算BigDecimal映射中的和,但不知道如何计算具有BigDecimal的对象列表中的和 我的对象的结构如下所示: Class Obj { private BigDecimal b; // Getter for b, say getB() } Map<String, List<Obj>> myMap; 类Obj{ 私人银行; //b的Getter,比如getB() } 地图我的地图

我一直在用一些优雅的方法在地图中求出
BigDecimal
s的总和。我知道如何计算
BigDecimal
映射中的和,但不知道如何计算具有
BigDecimal
的对象列表中的和

我的对象的结构如下所示:

Class Obj {
  private BigDecimal b;
  // Getter for b, say getB()
}

Map<String, List<Obj>> myMap;
类Obj{
私人银行;
//b的Getter,比如getB()
}
地图我的地图;
我需要得到
myMap
中所有
b
s的总和。在Java中寻找一些优雅的方法来实现这一点,可能是使用streams

  • 流式传输
    映射的值
  • 用于将
    BigDecimal
    s列表流展平为
    BigDecimal
    s列表流
  • 使用
    map
    提取
    BigDecimal
    s
  • 通过求和操作使用
    reduce
  • 获取一个标识值(求和值为零)和一个将中间结果相加的
    BinaryOperator


    您还可以使用方法引用来代替上面的lambda:
    BigDecimal::add

    Awesome。谢谢这很有效。也可以使用BigDecimal::add代替(a,b)->a.add(b),或者使用
    .reduce(BigDecimal::add).orElse(BigDecimal.ZERO)
    ,这样可以节省一个操作。
    BigDecimal sum = myMap.values()
        .stream()
        .flatMap(Collection::stream)
        .map(Obj::getB)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
    
    BigDecimal sum = myMap.values()
        .stream()
        .flatMap(Collection::stream)
        .map(Obj::getB)
        .reduce(BigDecimal.ZERO, BigDecimal::add);