私はList<LedgerEntry> ledgerEntries
を持っており、creditAmountとdebitAmountの合計を計算する必要があります。Java 8 1回の繰り返しで2つのオブジェクトプロパティを合計する
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
これを実装しました。リストを2回スチームしなくても、これを1回で済ませる方法はありますか?それは正しくそのreduce()
を指摘されたコメントで
LedgerEntry totalsEntry = entries.stream().reduce(new LedgerEntry(), (te, e) -> {
te.setCreditAmount(te.getCreditAmount().add(e.getCreditAmount()));
te.setDebitAmount(te.getDebitAmount().add(e.getDebitAmount()));
return te;
});
更新
:
あなたは合計エントリに減らすことができる前の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'は不変であるため実際に何もしないという事実のために修正された時)、どんなストリームよりも読みやすく保守性があります一度に2つの合計を計算しようとする解。 – Hoopje
@KrazyKalle:ありがとう。編集しました – Krishan
@KrazyKalle。はい。あなたは括弧の間にある文で何を意味すると思いますか? – Hoopje