将多个BigDecimals加到Map <string,bigdecimal =“”>

时间:2017-06-06 14:56:05

标签: java sum java-stream bigdecimal

我试图从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>的最佳方法是什么? (关键是收费/费用)

3 个答案:

答案 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;
            });

我认为我们应该尽量避免创建那些小帮助类。否则,您将遇到维护数十/数百个小班级的麻烦。