关于Java 9 Stream iterate method,我不确定Predicate
和UnaryOperator
方法的执行顺序。
请考虑以下示例:
Stream<BigInteger> streamIterate = Stream.iterate(BigInteger.ZERO, n -> n.intValue() < 100, n -> n.add(BigInteger.ONE));
streamIterate.forEach(System.out::println);
打印的值从0到99,这让我很困惑。
如果第一个流元素是seed
,并且如果满足当前元素的条件,则添加所有其他元素,这意味着当我们将99的值添加到流中它成为当前元素时,满足hasNext
条件并且我们应该期望在流结束之前将100作为最后一个值。
但是,流以99结尾。
你拥有的谓词只允许打印包含99
。 Stream.iterate(BigInteger.ZERO, n -> n.intValue() < 100, n -> n.add(BigInteger.ONE))
相当于,for (BigInteger n = BigInteger.ZERO; n.intValue() < 100; n.add(BigInteger.ONE))
。
这是一个更简单的例子,来自Baeldung,
Stream.iterate(0, i -> i < 10, i -> i + 1)
.forEach(System.out::println);
相当于,
for (int i = 0; i < 10; ++i) {
System.out.println(i);
}
只打印,0
通过9
。
据Stream.iterate(seed, hasNext, next)
doc说:
返回通过将给定的下一个函数迭代应用于初始元素而生成的顺序有序流,条件是满足给定的hasNext谓词。一旦hasNext谓词返回false,流就会终止。
所以100
不满足n.intValue() < 100
谓词,它不会被打印