Метод итерации Java 9 Stream игнорирует последний элемент потока - PullRequest
0 голосов
/ 19 марта 2019

Относительно метода итерации Java 9 Stream , я не уверен в порядке выполнения методов 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 .

Ответы [ 2 ]

4 голосов
/ 19 марта 2019

Предикат, который у вас есть, позволит печатать только до и включая 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.

4 голосов
/ 19 марта 2019

Согласно Stream.iterate(seed, hasNext, next) doc :

Возвращает последовательный упорядоченный поток, созданный итеративным применением данной следующей функции к начальному элементу, при условии удовлетворения заданного hasNextсказуемое. Поток завершается, как только предикат hasNext возвращает false.

То есть 100 не удовлетворяет предикату n.intValue() < 100 и не будет напечатан

...