我坚持使用一些优雅的方法在地图中获取BigDecimal
的总和。我知道如何计算BigDecimal
地图中的总和,但不知道带有BigDecimal
的对象列表。
我的对象的结构如下:
Class Obj {
private BigDecimal b;
// Getter for b, say getB()
}
Map<String, List<Obj>> myMap;
我需要得到myMap
中所有b
的总和.寻找一些优雅的方法在 Java 中做到这一点,可能是使用流?
- 流式传输
Map
的值。 - 使用
flatMap
将BigDecimal
的列表流平展为BigDecimal
的流。 - 使用
map
提取BigDecimal
。 - 将
reduce
与求和操作一起使用。
BigDecimal sum = myMap.values().stream()
.flatMap(List::stream)
.map(Obj::getB)
.reduce(BigDecimal.ZERO, (a, b) -> a.add(b) );
Stream.reduce
方法采用标识值(用于对值求和,零(和一个将中间结果相加的BinaryOperator
。
您也可以使用方法引用来代替上面的 lambda:BigDecimal::add
。
BigDecimal sum = myMap.values()
.stream()
.flatMap(Collection::stream)
.map(Obj::getB)
.reduce(BigDecimal.ZERO, BigDecimal::add);