2016-07-14 12 views
1

次のコードをJava 8 Streamに変換する方法はありますか?Java 8ストリーム内で最終変数を解決しない

final List ret = new ArrayList(values.size()); 
    double tmp = startPrice; 
    for (final Iterator it = values.iterator(); it.hasNext();) { 
     final DiscountValue discountValue = ((DiscountValue) it.next()).apply(quantity, tmp, digits, currencyIsoCode); 
     tmp -= discountValue.getAppliedValue(); 
     ret.add(discountValue); 
    } 

Java 8ストリームには最終変数tmpがありませんか?このような状況を解決する方法はありますか?囲み範囲で定義された

ローカル変数tmpが、

enter image description here

+5

ステップ1:raw * 'Iterator'ではなくgenericsを使用します。なぜ 'values'は生の' Collection'であり、一般的なCollection ではありませんか? – Andreas

+2

強化されたforループは、ここでより意味をなさないでしょう。 – khelwood

+0

実際これは非常に古いコードです。私は最新のJavaバージョンを使用して10年前に書かれたパッケージ全体をリファクタリングしています。提案のおかげで、確かにそれを行います。 –

答えて

5

まず最終又は効果的最終的なジェネリックと拡張forループを使用するようにコードを変更する必要があります。

List<DiscountValue> ret = new ArrayList<>(values.size()); 
double tmp = startPrice; 
for (DiscountValue value : values) { 
    DiscountValue discountValue = value.apply(quantity, tmp, digits, currencyIsoCode); 
    tmp -= discountValue.getAppliedValue(); 
    ret.add(discountValue); 
} 

私はストリームに変換することで滞在示唆し、ないと思いますが、あなたが主張する場合は、あなたに1要素配列を使用することができます。そして、valuesList<DiscountValue>をされたと仮定すると、これはあなたが得るものです価値所有者。

rettmpは、実質的に最終的なものである限り、finalと宣言する必要はありません。

List<DiscountValue> ret = new ArrayList<>(values.size()); 
double[] tmp = { startPrice }; 
values.stream().forEachOrdered(v -> { 
    DiscountValue discountValue = v.apply(quantity, tmp[0], digits, currencyIsoCode); 
    tmp[0] -= discountValue.getAppliedValue(); 
    ret.add(discountValue); 
}); 

ご覧のとおり、ストリームを使用して何も得られていません。コードは実際に悪化ですので、ではありません。

関連する問題