在Java中的对象列表的映射中总结BigDecimal

use*_*232 2 java bigdecimal java-stream

我坚持用一些优雅的方法BigDecimal在地图中得到s 的总和.我知道如何计算地图中的总和BigDecimal而不是带有的对象列表BigDecimal.

我的对象的结构如下:

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

Map<String, List<Obj>> myMap;
Run Code Online (Sandbox Code Playgroud)

我需要得到所有b的总和myMap.在Java中寻找一些优雅的方法,可能会使用流?

rge*_*man 7

  1. 流式传输的值Map.
  2. 用于flatMapBigDecimals 列表流压缩为s流BigDecimal.
  3. 使用map提取BigDecimal秒.
  4. 使用reduce带有求和运算.
BigDecimal sum = myMap.values().stream()
            .flatMap(List::stream)
            .map(Obj::getB)
            .reduce(BigDecimal.ZERO, (a, b) -> a.add(b) );
Run Code Online (Sandbox Code Playgroud)

Stream.reduce方法采用标识值(对于求和值,为零),以及BinaryOperator将中间结果加在一起的a.

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