2015-12-02 66 views
0

我在使用Java 8 Stream在哪裏迭代兩個集合,並且在傳遞一個過濾器之後,我想將我在流內部的一個大的變量加到外部bigDecimal變量「restrictionsNumber」總和在流內Bigdecimals

這裏我的代碼:

 final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits(); 
     order.products() 
      .stream() 
      .flatMap(product -> product.getRestrictions() 
            .stream() 
            .filter(restriction -> restriction.equals(newProductRestriction)) 
            .map(restriction -> restrictionsNumber.add(product.getAmount() 
                      .getNumberOfUnits()))); 

最後的地圖是一個地方我正嘗試總結兩個BigDecimals的。 我知道我做錯了什麼。 任何人都可以給我一個關於如何用Stream來做的建議。

我正嘗試從這個古老的時尚代碼

final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits(); 
for (Product product : order.products()) { 
    for (String oldProductRestriction : product.getRestrictions()) { 
     if (oldProductRestriction.equals(newProductRestriction)) { 
      restrictionsNumber = restrictionsNumber.add(product.getAmount() 
                     .getNumberOfUnits()); 
      } 
     } 
    } 

問候重構。

+0

我仍然不明白你在做什麼。你想擁有所有大整數的總和? – Jatin

+0

只有那些通過這個過濾器「.filter(限制 - > restriction.equals(newProductRestriction))」 – paul

+1

這還不清楚。你可以發佈一個示例輸入/輸出並解釋你想要做什麼? – Tunaki

回答

4

這可能是你所需要的(但它一直添加相同數量幾次每個產品,符合你原來的代碼,這似乎很奇怪):

BigDecimal sum = order.products() 
    .stream() 
    .flatMap(product -> product.getRestrictions() 
        .stream() 
        .filter(restriction -> restriction.equals(newProductRestriction)) 
        .map(restriction -> product.getAmount().getNumberOfUnits())) 
    .reduce(BigDecimal.ZERO, BigDecimal::add); 
BigDecimal result = restrictionsNumber.add(sum); 
+0

是的,你可以根據需要使用減少量。我試圖在流內進行添加,但是我認爲這是不可能的或者是錯誤的。感謝您的代碼 – paul

+3

如果這確實是預期的操作,請計算匹配項的數量,然後進行乘法運算,而不是使用map 'flatMap'會簡化它。 – Holger

+1

@Holger是的 - 絕對。 – assylias

0

這聽起來像你想要使用「reduce」操作。 Reduce用於對整個流進行求和或查找最大值等操作。

(如果你希望你除發生單個流元素那麼你的問題是,我不清楚,請補充詳細)

+0

我認爲是re​​duce,但我想要的是將我的流的值與外部變量相加。 final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits(); – paul