В этом посте рассматривается 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, являются их собственными. |