Может ли метод Stream SKIP сделать бесконечный поток конечным? - PullRequest
3 голосов
/ 18 марта 2019

"Методы limit() и skip() делают Stream меньшим. Они могут уменьшить конечный поток или могут создать конечный поток из бесконечного потока . Сигнатуры метода показаны здесь:

Stream<T> limit(int maxSize)
Stream<T> skip(int n)

Следующий код c .... "

Выше приведен отрывок из книги 8-й книги OCP. Когда он сказал, что « может создать конечный поток из бесконечного потока », они имели в виду это в обоих методах вместе или в одиночку? Я могу себе представить, как limit() сделает бесконечный поток меньше, но как только skip() это сделает? Есть ли способ или формулировка в документации должна быть более понятной?

Ответы [ 2 ]

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

"может создать конечный поток из бесконечного потока" , безусловно, применимо только к limit(), а не к skip().

skip - это все равно что взять чашку воды из океана и задаться вопросом «сколько воды осталось в океане?» я взял из океана? "

Если поток бесконечен, то пропуск нескольких элементов все равно оставит вас в бесконечном потоке ...

Stream.iterate(0L, i -> i + 1).skip(100).forEach(System.out::println);

Теоретически это будет продолжаться вечно. Так что, скорее всего, это лишь небольшая неточность, которая ускользнула от рецензента книги.

2 голосов
/ 18 марта 2019

Если вы внимательно изучите документ Java, вы увидите, что для limit(long maxSize) упоминается, что это операция с коротким замыканием .Это означает, что он может работать не со всеми элементами исходного потока, как только заданные критерии будут выполнены, он выйдет.Так что это работает при изменении бесконечного потока на конечный.

Возвращает поток, состоящий из элементов этого потока, усеченный до длины не более maxSize.

Thisявляется короткозамкнутой промежуточной операцией с состоянием.

С другой стороны, метод skip(long n) не претендует на такие требования, поэтому в принципе после пропуска n элементов поток все еще может быть бесконечным:

Возвращает поток, состоящий из оставшихся элементов этого потока после отбрасывания первых n элементов потока.Если этот поток содержит менее n элементов, то будет возвращен пустой поток.

Это промежуточная операция с состоянием.

Таким образом, в книге, которую вы читаете, неверная формулировка оskip метод.

...