我试图从List
中总结多个BigDecimals。目前,我使用了两个流,但是如果可能的话,我希望只有一个流。我不确定如何以高效的方式重写下面的内容。
BigDecimal totalCharges = tableRowDataList.stream()
.map(el -> el.getSums().getCharges())
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalFees = tableRowDataList.stream()
.map(el -> el.getSums().getFees())
.reduce(BigDecimal.ZERO, BigDecimal::add);
正如您所看到的,流基本上是相同的,只有对getCharges / getFees的调用不同。
从上方获得结果Map<String, BigDecimal>
的最佳方法是什么? (关键是收费/费用)
答案 0 :(得分:5)
首先,您要创建一个用于收集结果的类。
然后你就像BigDecimal一样,即ZERO
常量和add()
方法。
public class ChargesAndFees {
private static final ZERO = new ChargesAndFees(BigDecimal.ZERO, BigDecimal.ZERO);
private final BigDecimal charges;
private final BigDecimal fees;
// constructor and getters
public ChargesAndFees add(ChargesAndFees that) {
return new ChargesAndFees(this.charges.add(that.charges),
this.fees.add(that.fees));
}
}
现在你可以做流逻辑
了ChargesAndFees totals = tableRowDataList.stream()
.map(el -> new ChargesAndFees(el.getSums().getCharges(),
el.getSums().getFees()))
.reduce(ChargesAndFees.ZERO, ChargesAndFees::add);
如果您坚持,则可以将totals
中的值转换为Map
。
答案 1 :(得分:2)
如果你有一个List&lt; TableRowDataElement&gt;对象列表,每个对象都有一个Sums对象 - 你是否控制了TableRowDataElement和/或Sums的定义?
如果您在TableRowDataElement或Sums中创建一个add方法,那么您可以简化这一过程而无需额外的类 -
Sums sums = tableRowDataList.stream()
.map(el -> el.getSums())
.reduce(new Sums(0,0), Sums::add);
答案 2 :(得分:0)
尝试StreamEx:
Optional<Entry<BigDecimal, BigDecimal>> res = StreamEx.of(tableRowDataList)
.map(e -> e.getSums())
.mapToEntry(s -> s.getCharges(), s -> s.getFees())
.reduce((a, b) -> {
a.getKey().add(b.getKey());
b.getKey().add(b.getValue());
return a;
});
我认为我们应该尽量避免创建那些小帮助类。否则,您将遇到维护数十/数百个小班级的麻烦。