Java 9 Stream iterate方法忽略流的最后一个元素

问题描述 投票:-3回答:2

关于Java 9 Stream iterate method,我不确定PredicateUnaryOperator方法的执行顺序。

请考虑以下示例:

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结尾。

java java-stream java-9
2个回答
4
投票

你拥有的谓词只允许打印包含99Stream.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


4
投票

Stream.iterate(seed, hasNext, next) doc说:

返回通过将给定的下一个函数迭代应用于初始元素而生成的顺序有序流,条件是满足给定的hasNext谓词。一旦hasNext谓词返回false,流就会终止。

所以100不满足n.intValue() < 100谓词,它不会被打印

© www.soinside.com 2019 - 2024. All rights reserved.