Streams:一次性计算总计的差异

Streams : Calculate the difference of totals in one go

我有一个 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 两次。有没有一种方法可以一次性完成这项工作,而不必重复两次?

只需将其减少为:

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

您可以减去 map 中的个别金额,然后使用 reduce

sum
ledgerEntries.stream()
    .map(e->e.getCreditAmount().subtract(e.getDebitAmount())
    .reduce(0,BigDecimal::add);

这是我的解决方案:

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

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