流:一次计算总数的差异

Kri*_*han 5 java lambda bigdecimal java-8 java-stream

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

class LedgerEntry{
 private BigDecimal creditAmount;
 private BigDecimal debitAmount;

 //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我实现了这个,

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

这看起来像是在迭代List两次.有没有办法一次性完成这项工作,而无需两次蒸发列表?

man*_*uti 6

只需将其减少为:

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


CKi*_*ing 4

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

ledgerEntries.stream()
    .map(e->e.getCreditAmount().subtract(e.getDebitAmount())
    .reduce(0,BigDecimal::add);
Run Code Online (Sandbox Code Playgroud)