Может ли метод ПРОПУСКОВ Stream сделать бесконечный поток конечным?

#java #java-8 #java-stream #ocpjp

#java #java-8 #java-stream #ocpjp

Вопрос:

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

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

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

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

Комментарии:

1. Я предполагаю, что здесь они немного ошиблись в формулировках. Я скажу, что они могут together создать конечный поток.

Ответ №1:

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

skip это все равно, что взять чашку воды из океана и задаться вопросом: «сколько воды осталось в океане?», тогда как limit это все равно, что взять из нее ту же чашку воды и задаться вопросом: «сколько воды я взял из океана?»

Если поток бесконечен, то пропуск ряда элементов все равно оставит вас с бесконечным потоком…

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

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

Ответ №2:

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

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

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

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

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

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

Итак, в книге, которую вы читаете, неверно сформулирован skip метод.