为什么在 lambda 中使用 ++i 而不是 i++

Tii*_*ina 4 lambda java-9

我碰巧知道,在下面的表达式中,使用i++将导致无限流,i将始终为 0。我感到困惑是因为我认为i++没有使用返回值,即使如此,它也不应该在i之后中断增量。

IntStream.iterate(0, i-> i<10, i-> ++i).forEach(....)
Run Code Online (Sandbox Code Playgroud)

Adr*_*hum 5

通过检查 Java 9 的 API IntStreamhttp : //download.java.net/java/jdk9/docs/api/java/util/stream/IntStream.html#iterate-int-java.util.function.IntPredicate-java。 util.function.IntUnaryOperator-

最后一个功能(i -> ++i在您的情况下)是确定下一个值是什么。

如果你 put i->i++,假设它是一个后缀增量运算符,则i++计算为i增量之前。这意味着它总是返回相同的值(0在你的情况下是种子)。因此,它的工作原理就像您放置i -> i. 请注意,Java 中的参数是按值传递的。因此,您在 lambda 中的增量不会影响调用者。

因此,hasNext谓词(i->i<10在您的情况下是第二个参数)始终评估为真,从而为您提供一个无限的全零流。