У меня есть List<LedgerEntry> ledgerEntries
, и мне нужно рассчитать суммы creditAmount и debitAmount.Java 8 Сумма двух свойств объекта за одну итерацию
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
Это выглядит как я итерация в список дважды. Есть ли способ сделать это за один раз, не перепуская список дважды?
Pre 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 и (когда исправлено то, что она фактически ничего не делает, потому что «BigDecimal's являются неизменяемыми») более читабельными и поддерживаемыми (и, вероятно, более эффективными), чем любой поток решение, которое пытается рассчитать две суммы сразу. – Hoopje
@KrazyKalle: Спасибо. сделал редактирование – Krishan
@ KrazyKalle. Да. Как вы думаете, что я имел в виду с предложением между круглыми скобками (когда фиксировано ... неизменным)? – Hoopje