【发布时间】:2017-07-12 04:33:02
【问题描述】:
我有一个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);
//...
//Use creditTotal, debitTotal later
这看起来像我在 List 上迭代了两次。有没有一种方法可以一次性完成此任务,而无需两次对列表进行蒸汽处理?
Java 8 之前的版本
BigDecimal creditTotal = BigDecimal.ZERO;
BigDecimal debitTotal = BigDecimal.ZERO;
for(LedgerEntry entry : ledgerEntries){
creditTotal = creditTotal.add(entry.getCreditAmount());
debitTotal = debitTotal.add(entry.getDebitAmount());
}
【问题讨论】:
-
为什么要使用流?您的“Pre Java 8”版本也是 100% 有效的 Java 8 并且(由于
BigDecimals 是不可变的,它实际上并没有做任何事情而被修复)比任何流都更具可读性和可维护性(并且可能更高效)尝试一次计算两个总和的解决方案。 -
@KrazyKalle:谢谢。做了编辑
-
@KrazyKalle。是的。你认为我在括号之间的句子是什么意思(当固定时......不可变时)?
-
顺便说一下,你可以写
.filter(LedgerEntry::getCreditAmount)来为 lambdas 使用方法引用。
标签: java lambda foreach java-8 java-stream