2016-07-14 9 views
1

Gibt es eine Möglichkeit, den folgenden Code in Java 8 Stream zu konvertieren.Lösen Sie keine letzte Variable in Java 8 Stream

Java 8 Streams beschwert sich über keine endgültige Variable tmp? Gibt es eine Möglichkeit, solche Situationen zu lösen?

lokal Variable tmp in einem einschließenden Rahmen definiert wird, muss endgültig sein oder effektiv endgültig

enter image description here

+5

Schritt 1: Verwenden Sie Generika, nicht * roh * 'Iterator'. Warum ist 'values' eine rohe' Collection', keine generische 'Collection '? – Andreas

+2

Eine erweiterte for-Schleife wäre hier sinnvoller. – khelwood

+0

Eigentlich ist das ein sehr alter Code. Ich überarbeite das ganze Paket, das vor 10 Jahren mit der neuesten Java-Version geschrieben wurde. Danke für den Vorschlag, werde das sicher tun. –

Antwort

5

Erstens, den Code ändern und eine verbesserte generics for Schleife zu verwenden. Unter der Annahme, values wird dann eine List<DiscountValue>, ist es das, was Sie bekommen:

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

Ich würde vorschlagen, mit, dass der Aufenthalt, und nicht wandeln es in Strömen, aber wenn Sie darauf bestehen, können Sie ein Ein-Element-Array als ein verwenden Werthalter.

Beachten Sie, dass ret und tmp nicht final deklariert werden müssen, solange sie effektiv final sind.

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

Wie Sie sehen können, haben Sie durch die Verwendung von Streams nichts gewonnen. Der Code ist eigentlich schlechter, so ... nicht.