在 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 中寻找一些优雅的方法来执行此操作,可能正在使用流?
- 流式传输
Map
的值。
- 使用
flatMap
将 BigDecimal
列表流扁平化为 BigDecimal
列表流。
- 使用
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
.
BigDecimal sum = myMap.values()
.stream()
.flatMap(Collection::stream)
.map(Obj::getB)
.reduce(BigDecimal.ZERO, BigDecimal::add);
我坚持使用一些优雅的方法来获取地图中 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
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
.
BigDecimal sum = myMap.values()
.stream()
.flatMap(Collection::stream)
.map(Obj::getB)
.reduce(BigDecimal.ZERO, BigDecimal::add);