关于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 结尾。
答案 0 :(得分:4)
根据Stream.iterate(seed, hasNext, next)
doc:
以给定的hasNext谓词为条件,返回通过将给定的next函数迭代应用到初始元素而产生的顺序有序流。 当hasNext谓词返回false时,流终止。
因此,100
不满足n.intValue() < 100
谓词,因此不会被打印
答案 1 :(得分:4)
您拥有的谓词将只允许打印最多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))
等同于Stream.iterate(0, i -> i < 10, i -> i + 1)
.forEach(System.out::println);
。
这是一个更简单的示例,来自Baeldung,
for (int i = 0; i < 10; ++i) {
System.out.println(i);
}
等同于
0
只能打印9
至{{1}}。