No resuelva ninguna variable final dentro de Java 8 Stream

Hay una manera de convertir el siguiente código a Java 8 Stream.

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 streams se queja de que no hay una variable final tmp? ¿Hay alguna manera de resolver tales situaciones?

La variable local tmp definida en un ámbito adjunto debe ser final o efectiva final

introduzca la descripción de la imagen aquí

Primero, cambie el código para usar generics y un bucle mejorado for . Suponiendo que los values son una List , esto es lo que obtienes:

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

Le sugiero que se quede con eso y que no lo convierta en flujos, pero si insiste, puede usar una matriz de un elemento como poseedor de valor.

Tenga en cuenta que ret y tmp no tienen que declararse final , siempre que sean efectivamente definitivos.

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

Como puedes ver, no has ganado nada usando streams. El código es realmente peor , así que … no lo hagas .