我坚持使用一些优雅的方法来获取地图中BigDecimal
的总和。我知道如何计算BigDecimal
地图中的总和,但不知道带有BigDecimal
的对象列表。
我的对象结构如下:
Class Obj {
private BigDecimal b;
// Getter for b, say getB()
}
Map<String, List<Obj>> myMap;
我需要获得b
中所有myMap
的总和。在Java中寻找一些优雅的方法,可能正在使用流?
答案 0 :(得分:7)
Map
。flatMap
将BigDecimal
s列表流展平为BigDecimal
s流。map
提取BigDecimal
s。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
。
答案 1 :(得分:3)
BigDecimal sum = myMap.values()
.stream()
.flatMap(Collection::stream)
.map(Obj::getB)
.reduce(BigDecimal.ZERO, BigDecimal::add);