我有一个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
两次迭代。有没有办法一次性完成这项工作而不必两次蒸汽清单?
答案 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
将它们加在一起。