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
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 .