流:一次计算总计的差异
问题描述:
我有一个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
两次。有没有办法一次完成这项工作,而无需两次蒸汽清单?
答
您可以减去单项金额在map
,然后sum
他们使用reduce
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
将它们加在一起。
谢谢。那很快。 在同一张纸条上,如果我分别需要两个值(即:creditTotal和debitTotal分开)会怎么样。 – Krishan
@Krishan欢迎您。你能否分别需要两个值来详细说明你的意思? – CKing
就像在我的问题,如果我需要creditTotal和debitTotal值分别以后使用,我可以通过迭代通过列表一次吗?对同一个列表使用stream()两次似乎就是遍历列表两次?或者情况并非如此,编译器会优化流式传输? – Krishan