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
将它们加在一起。
我有一个 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
将它们加在一起。