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

Summing up BigDecimal in a map of list of objects in Java

我坚持使用一些优雅的方法来获取地图中 BigDecimal 的总和。我知道如何计算 BigDecimal 的地图中的总和,但不知道如何计算 BigDecimal.

的对象列表

我的对象结构如下:

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

Map<String, List<Obj>> myMap;

我需要得到 myMap 中所有 b 的总和。在 Java 中寻找一些优雅的方法来执行此操作,可能正在使用流?

  1. 流式传输 Map 的值。
  2. 使用 flatMapBigDecimal 列表流扁平化为 BigDecimal 列表流。
  3. 使用map提取BigDecimals。
  4. 使用 reduce 进行求和运算。
BigDecimal sum = myMap.values().stream()
            .flatMap(List::stream)
            .map(Obj::getB)
            .reduce(BigDecimal.ZERO, (a, b) -> a.add(b) );

Stream.reduce method 接受一个标识值(对于求和值,零)和一个将中间结果相加的 BinaryOperator

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

BigDecimal sum = myMap.values()
    .stream()
    .flatMap(Collection::stream)
    .map(Obj::getB)
    .reduce(BigDecimal.ZERO, BigDecimal::add);