Java 9 流迭代方法忽略流的最后一个元素
Java 9 Stream iterate method ignores the last element of the stream
关于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[的值时=32=] 到流中它成为当前元素,满足 hasNext
条件,我们应该期望 100 作为流结束之前的最后一个值。
但是,流以 99 结束。
根据Stream.iterate(seed, hasNext, next)
doc:
Returns a sequential ordered Stream produced by iterative application of the given next function to an initial element, conditioned on satisfying the given hasNext predicate. The stream terminates as soon as the hasNext predicate returns false.
所以100
不满足n.intValue() < 100
谓词,不会被打印
您拥有的谓词最多只允许打印 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
。
关于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[的值时=32=] 到流中它成为当前元素,满足 hasNext
条件,我们应该期望 100 作为流结束之前的最后一个值。
但是,流以 99 结束。
根据Stream.iterate(seed, hasNext, next)
doc:
Returns a sequential ordered Stream produced by iterative application of the given next function to an initial element, conditioned on satisfying the given hasNext predicate. The stream terminates as soon as the hasNext predicate returns false.
所以100
不满足n.intValue() < 100
谓词,不会被打印
您拥有的谓词最多只允许打印 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
。