【发布时间】:2016-07-14 13:00:44
【问题描述】:
有没有办法将以下代码转换为 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 流抱怨没有最终变量 tmp ?有没有办法解决这种情况?
在封闭范围内定义的局部变量 tmp 必须是 final 或有效 final
【问题讨论】:
-
第 1 步:使用泛型,而不是 raw
Iterator。为什么values是原始的Collection,而不是通用的Collection<DiscountValue>? -
增强的 for 循环在这里会更有意义。
-
我没有看到任何可能抱怨没有最终变量 tmp 的 Stream 代码...
-
为什么apply方法需要tmp变量?
-
好吧,如果你想将它转换为 java 8 流,你应该从循环中删除突变并使用 map 和/或 reduce。将其 1:1 转换为 java 8 forEach 有点毫无意义。如果您不想更改逻辑,则应将其转换为泛型 + 普通 foreach 循环。
标签: java java-8 java-stream