【问题标题】:Java8 variable in for loopfor循环中的Java8变量
【发布时间】:2020-04-25 05:32:54
【问题描述】:
int sum = a;
int pow = 1;

for (int i = 0; i < n ; i++) {
    sum += b*pow;
    System.out.print(sum+" ");
    pow *= 2;
}

在 Java-8 中使用 Stream 会为 sumpow 变量提供错误,即该变量应为 final

【问题讨论】:

  • 您可以使用AtomicInteger 而不是常规的int 来规避该问题。
  • @EdwinDalorzo:这是一种解决方法,也是一种数组技巧,但是原则上是错误的。 java-stream 提供了处理此类操作的机制。
  • 您的Stream 尝试看起来如何?
  • 看到AtomicInteger 会让读者想知道一个简单的管道是如何并发的,除了将循环转换为流之外,还会带来另一个不必要的性能损失。我强烈反对这种类型的滥用。

标签: java for-loop java-8 java-stream


【解决方案1】:

您可以使用 IntStream 生成的 Stream 并以相同的方式处理数字。请注意,Math::pow 返回 Double,因此管道会导致 DoubleStream

IntStream.range(0, n).mapToDouble(i -> b * Math.pow(2, i)).reduce(Double::sum);

唯一的缺点是减少期间没有消费者可用,因此您必须稍微修改一下:

IntStream.range(0, n).mapToDouble(i -> b * Math.pow(2, i)).reduce((left, right) -> {
    double s = left + right;
    System.out.println(s);
    return s;
});

回答这个问题:

在 java8 中使用流给出 sum 和 pow 变量的错误,该变量应该是最终的。

条件之一是 lambda 表达式中使用的变量必须是 finaleffectively-final,因此您在 for 中使用的可变操作-loop 是不允许的,必须用 Streams 的映射功能替换。 http://ilkinulas.github.io 很好地解释了这个问题。


请记住,您不能像使用 for 循环一样使用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2017-03-22
    • 2021-12-22
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多