2017-02-22 4 views
5

私はList<LedgerEntry> ledgerEntriesです。私はcreditAmountとdebitAmountの合計を計算する必要があります。私は二回Listを反復処理していますように私はこれを実装したストリーム:1回の合計の差を計算します

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); 

これが見えます。リストを2回スチームしなくても、これを1回で済ませる方法はありますか?

答えて

4

私のソリューションです:

BigDecimal result = array.stream().reduce(BigDecimal.ZERO, 
      (bigDecimal, ledgerEntry) -> bigDecimal.add(ledgerEntry.getCreditAmount()).subtract(ledgerEntry.getDebitAmount()), 
      BigDecimal::add); 

私は各クレジットデビットペアの違いを得て、reduceを使ってそれらを一緒に加算します。

+0

ありがとうございます。それは速かった。 同じメモでは、2つの値が別々に必要な場合(つまり、creditTotalとdebitTotalを別々に)どうすればよいでしょうか。 – Krishan

+1

@Krishanようこそ。あなたは別々に2つの値を必要とすることによってあなたが意味することを詳しく説明できますか? – CKing

+0

私の質問と同じように、後で使用するcreditTotalとdebitTotalの値が別々に必要な場合は、リストを一度反復するだけでそれを行うことができますか?同じリストに対してstream()を2回使用すると、リストを2回反復するように見えますか?それとも、コンパイラはストリーミングを最適化するためにいくつかの魔法をしていますか? – Krishan

6

だけにそれを減らす:あなたがここにreduce

ledgerEntries.stream() 
    .map(e->e.getCreditAmount().subtract(e.getDebitAmount()) 
    .reduce(0,BigDecimal::add); 
+1

* creditTotal.subtract(debitTotal); * ...... – CKing

+1

@CKingこれはタイプミスです...修正されました。 – manouti

+1

Downvote retracted。 +1 – CKing

3
BigDecimal result = ledgeredEntries.stream().map(p -> p.getCreditAmount().subtract(p.getDebitAmount())) 
      .reduce(BigDecimal.ZERO, BigDecimal::add); 
+1

* creditTotal.subtract(debitTotal); ..... * – CKing

+1

固定、ありがとうございました – kamehl23

+0

残念ながら、これはあなたの最初の試みから完全に新しい答えになりました。修正よりも再ポストの方が多い。 – CKing

2

を使用してそれらをmapに個々の量を減算して、sumでき

BigDecimal sumCreditDebit = ledgeredEntries.stream().map(p -> p.getCreditAmount() 
     .subtract(p.getDebitAmount())) 
     .reduce(BigDecimal.ZERO, BigDecimal::add);