Mam List<LedgerEntry> ledgerEntries
i potrzebuję obliczyć sumy wartości creditAmount i debitAmount.Java 8 Sumowanie dwóch właściwości obiektu w jednej iteracji
class LedgerEntry{
private BigDecimal creditAmount;
private BigDecimal debitAmount;
//getters and setters
}
I wprowadziły to jak
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
To wygląda jakbym iteracji po liście dwukrotnie. Czy istnieje sposób na zrobienie tego za jednym zamachem bez konieczności parowania listy dwukrotnie?
Pre Java 8 wersja
BigDecimal creditTotal = BigDecimal.ZERO;
BigDecimal debitTotal = BigDecimal.ZERO;
for(LedgerEntry entry : ledgerEntries){
creditTotal = creditTotal.add(entry.getCreditAmount());
debitTotal = debitTotal.add(entry.getDebitAmount());
}
Dlaczego chcesz używać strumieni? Twoja wersja "Pre Java 8" jest również w 100% poprawną Javą 8 i (gdy jest ustalona, ponieważ nie robi nic, ponieważ 'BigDecimal's są niezmienne) bardziej czytelna i możliwa do utrzymania (i prawdopodobnie bardziej wydajna) niż jakikolwiek strumień rozwiązanie, które próbuje obliczyć dwie sumy naraz. – Hoopje
@KrazyKalle: Dzięki. zrobił edycję – Krishan
@KrazyKalle. Tak. Jak myślisz, co miałem na myśli, mówiąc o zdaniu między nawiasami (gdy jest stały ... niezmienny)? – Hoopje