代码之家  ›  专栏  ›  技术社区  ›  user2220232

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

  •  2
  • user2220232  · 技术社区  · 6 年前

    我一直在用一些优雅的方法来总结 BigDecimal s在地图上。我知道如何计算 BigDecimal 但不是具有 BigDecimal

    我的对象结构如下:

    Class Obj {
      private BigDecimal b;
      // Getter for b, say getB()
    }
    
    Map<String, List<Obj>> myMap;
    

    我需要得到所有的总数 b s英寸 myMap 。在Java中寻找一些优雅的方法来实现这一点,可能是使用streams?

    2 回复  |  直到 6 年前
        1
  •  8
  •   rgettman    6 年前
    1. 流式传输 Map
    2. 使用 flatMap 将列表流展平 BigDecimal s到流 BigDecimal s
    3. 使用 map 提取 BigDecimal s
    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

        2
  •  3
  •   Karol Dowbecki    6 年前
    BigDecimal sum = myMap.values()
        .stream()
        .flatMap(Collection::stream)
        .map(Obj::getB)
        .reduce(BigDecimal.ZERO, BigDecimal::add);