Java 9 Stream迭代方法将忽略流的最后一个元素

时间:2019-03-19 18:05:08

标签: java java-stream java-9

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

2 个答案:

答案 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}}。