流:一次计算总数的差异

时间:2017-02-22 07:43:41

标签: java lambda java-8 java-stream bigdecimal

我有一个List<LedgerEntry> ledgerEntries,我需要计算creditAmount和debitAmount的总和。

class LedgerEntry{
 private BigDecimal creditAmount;
 private BigDecimal debitAmount;

 //getters and setters
}

我已将此实现为,

BigDecimal creditTotal = ledgeredEntries.stream().map(p ->p.getCreditAmount()).
reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal debitTotal = ledgeredEntries.stream().map(p ->p.getDebitAmount()).
reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal sumCreditDebit = creditTotal.subtract(debitTotal);

这看起来像是在List两次迭代。有没有办法一次性完成这项工作而不必两次蒸汽清单?

4 个答案:

答案 0 :(得分:6)

将其缩小为:

BigDecimal sumCreditDebit = ledgeredEntries.stream().map(p -> p.getCreditAmount()
        .subtract(p.getDebitAmount()))
        .reduce(BigDecimal.ZERO, BigDecimal::add);

答案 1 :(得分:4)

您可以使用map

减去sum中的个别金额,然后减去reduce个金额
ledgerEntries.stream()
    .map(e->e.getCreditAmount().subtract(e.getDebitAmount())
    .reduce(0,BigDecimal::add);

答案 2 :(得分:3)

BigDecimal result = ledgeredEntries.stream().map(p -> p.getCreditAmount().subtract(p.getDebitAmount()))
            .reduce(BigDecimal.ZERO, BigDecimal::add);

答案 3 :(得分:2)

这是我的解决方案:

    BigDecimal result = array.stream().reduce(BigDecimal.ZERO,
            (bigDecimal, ledgerEntry) -> bigDecimal.add(ledgerEntry.getCreditAmount()).subtract(ledgerEntry.getDebitAmount()),
            BigDecimal::add);

我得到每个信用卡借方对之间的差异,并使用reduce将它们加在一起。

相关问题