Статьи

API Java 9 Streams с использованием JShell

В этом посте рассматривается API Java 9 Streams с использованием JShell. Изменения API-интерфейса Streams основаны на успехе Streams в Java 8 и предоставляют ряд вспомогательных методов — takeWhile, dropWhile и iterate. Этот пост продолжает My Top Java 9 Features и исследует эти методы с использованием Jshell.

API потоков

Streams API и Lambda были наиболее успешными функциями Java 8, и изменения в Java 9 основаны на этом с некоторыми новыми служебными методами.

1
2
jshell> Stream.of(1,2,3,4,5).takeWhile(p->p<3).forEach(System.out::print);
12

Теперь давайте вернем все значения больше 3, и мы увидим, что предикат мгновенно возвращает false, и мы ничего не получаем

1
2
3
jshell> Stream.of(1,2,3,4,5).takeWhile(p -> p > 3).forEach(System.out::print);
 
jshell>
  • Ненумерованные списки — самый длинный список значений до тех пор, пока не произойдет сбой предиката, хотя могут быть значения в нисходящем потоке, которые удовлетворяют предикату, и они не будут возвращены

Мы можем видеть это ниже, где список возвращает только 2, даже если последний элемент равен 1, тогда как упорядоченный список возвратил бы 1 и 2 —

1
2
jshell> Stream.of(2,3,6,5,1).takeWhile(p -> p < 3).forEach(System.out::print);
2

dropWhile (Предикатный предикат)

dropWhile обеспечивает противоположное поведение takeWhile, поэтому записи удаляются, пока предикат имеет значение true. Как и прежде, у нас есть аналогичные соображения для отсортированных и несортированных списков.

  • Упорядоченные списки — вернет самый длинный список записей, исключая те элементы, которые удовлетворяют предикату
1
2
jshell> Stream.of(1,2,3,4,5).dropWhile(p -> p < 3).forEach(System.out::print);
345
  • Неупорядоченные списки — удалит первые записи, которые удовлетворяют предикату —
1
2
3
4
5
jshell> Stream.of(2,3,6,5,1).dropWhile(p -> p < 3).forEach(System.out::print);
3651
 
jshell> Stream.of(1,2,3,5,6).dropWhile(p -> p < 3).forEach(System.out::print);
365

dropWhile / takeWhile Выводы

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

повторять (T seed, Predicate hasNext, UnaryOperator next)

Это работает аналогично циклу for. Принимая начальное значение (T seed), условие выхода (Predicate)
hasNext) и есть ли у нас следующее значение (Предикат
hasNext)

У метода итерации есть условие выхода —

1
2
3
4
5
6
jshell> Stream.iterate(1, i -> i < 6, i -> i + 1).forEach(System.out::println);
1
2
3
4
5

Вывод

dropWhile и takeWhile представляют некоторые полезные служебные методы для API Java Streams. Основное значение имеет то, упорядочены или неупорядочены ваши потоки. Метод Stream.iterate позволяет нам иметь функциональность for-loop внутри Stream. Я с нетерпением жду, чтобы услышать опыт людей с этими новыми методами.

Опубликовано на Java Code Geeks с разрешения Мартина Фаррелла, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Java 9 Streams API с использованием JShell

Мнения, высказанные участниками Java Code Geeks, являются их собственными.