我知道在下面这个表达式中,使用 i++
会导致无限流,i
会一直为0。我感到困惑的原因是我认为 i++
返回值没有被使用,即使如此,它也不应该打断 i
的增量。
IntStream.iterate(0, i-> i<10, i-> ++i).forEach(....)
通过查看Java 9的API:IntStream
:http://download.java.net/java/jdk9/docs/api/java/util/stream/IntStream.html#iterate-int-java.util.function.IntPredicate-java.util.function.IntUnaryOperator-
最后一个函数(在您的情况下为i->++i
)是确定下一个值的函数。
如果您使用i->i++
,鉴于它是后缀递增运算符,i++
在递增之前会计算出i
。这意味着它始终返回相同的值(在您的情况下为种子0
)。因此,它的作用就像您放置了i->i
。请注意,在Java中,参数是按值传递的。因此,您在lambda中的递增不会影响调用者。
因此,hasNext
谓词(第二个参数,在您的情况下为i->i<10
)始终评估为true,从而为您提供所有零的无限流。
i -> i++
中有一个非常令人困惑的序列。1) i
被赋值为 i
,2) i
增加 1。但无论哪个先执行,除非 i
永远不会增加 1(就像 ++
运算符总是这样做的),否则 i
不应该永远为 0。这是我不理解的部分。 - TiinaIntStream
下一个值是什么(给定前一个值)。在函数中做什么并不重要,只要返回某个值,那个返回的值就是下一个要使用的值。 - Adrian Shumi -> i++
就像是 i -> {int temp = i; i = i + 1; return temp}
。由于参数是按值传递的,因此你的 i=i+1
对调用者没有影响。因此下一个值始终与原始值相同。 - Adrian Shum您可以使用 limit 并执行您所提出的操作:
IntStream.iterate(0, i -> i++).limit(10).forEach(....)
还有这个可能会有帮助:
i++
不会增加 i
。这对我来说挑战了“常识”。 - TiinaIntStream.iterate(0, i -> i < 10, new IntUnaryOperator() {
@Override
public int applyAsInt(int i) {
return i++;
}
})
.forEach(System.out::println);
IntStream.iterate(0, i-> i<10, i-> i+1).forEach(....)
不应该更自然吗?你使用i++
或++i
有什么理由吗? - ymonadi+1
也可以。我一直在想为什么i++
不行,现在清楚了。i++
在一个函数中运行,函数返回值被赋给了i
... - Tiina