将多个BigDecimals汇总到Map <String,BigDecimal>

Mic*_*el 3 java sum bigdecimal java-stream

我试图从a中加总多个BigDecimals List.目前,我正在使用两个流,但是如果可能的话,我希望只有一个流.我不确定如何以高效的方式重写下面的内容.

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);
Run Code Online (Sandbox Code Playgroud)

如您所见,流基本上是相同的,只有对getCharges/getFees的调用不同.

Map<String, BigDecimal>从上面获得结果的最佳方法是什么?(关键是收费/费用)

And*_*eas 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以做流逻辑了

ChargesAndFees totals = tableRowDataList.stream()
        .map(el -> new ChargesAndFees(el.getSums().getCharges(),
                                      el.getSums().getFees()))
        .reduce(ChargesAndFees.ZERO, ChargesAndFees::add);
Run Code Online (Sandbox Code Playgroud)

如果你坚持,你可以将值转换totals为a Map.