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

时间:2018-04-19 22:50:18

标签: java java-stream bigdecimal

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

我的对象结构如下:

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

Map<String, List<Obj>> myMap;

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

2 个答案:

答案 0 :(得分:7)

  1. 流式传输Map
  2. 的值
  3. 使用flatMapBigDecimal s列表流展平为BigDecimal s流。
  4. 使用map提取BigDecimal s。
  5. 使用reduce进行求和操作。
  6. 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

答案 1 :(得分:3)

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