Автор оригинала: Pankaj Kumar.
Опубликуйте Краткое содержание:
- Вступление
- Java SE 8: Основы потокового API
- Java SE 9: Улучшения потокового API
- Java SE 9: Метод Stream API takeWhile()
- Java SE 9: Метод dropWhile() потокового API
- Java SE 9: Метод итерации API потока()
- Java SE 9: Потоковый API метода Nullable()
Вступление
Корпорация Oracle собирается выпустить новую версию Java: Java SE 9 примерно в конце марта 2017 года. Итак, я хотел бы опубликовать серию сообщений о новых функциях Java SE 9. Это мой девятый пост в этой серии.
В этом посте сначала мы обсудим основы Java SE 8 Stream API, а затем представим улучшения Java SE 9 Stream API. Давайте начнем с основ API потока в следующем разделе.
Java SE 8: Основы потокового API
Как мы знаем, одним из больших изменений, внесенных корпорацией Oracle в выпуск Java SE 8, является Stream API . Другое большое изменение-это Лямбда-выражения .
Что такое поток? Поток представляет собой последовательность элементов и легко поддерживает набор агрегатных операций над ними. Он поддерживает эти операции либо последовательно, либо параллельно, в зависимости от ваших требований. Корпорация Oracle определила этот новый потоковый API в пакете java.util.stream.
Важной вещью в этом API является Поток интерфейс. Основное преимущество этого потокового API заключается в том, что он поддерживает внутреннюю итерацию. Благодаря этой новой функции в Stream API мы можем выполнять наши операции лениво и параллельно.
Давайте теперь выполним некоторые потоковые операции.
Пример:-
jshell> import java.util.stream.* jshell> Stream stream = Stream.of(1,2,3,4,5,6,7,8,9,10) stream ==> java.util.stream.ReferencePipeline$Head@64bfbc86 jshell> stream.forEach(x -> System.out.println(x)); 1 2 3 4 5 6 7 8 9 10
Чтобы узнать больше об основах API Java SE 8 Stream, пожалуйста, ознакомьтесь с этим руководством: Java 8 Stream .
Java SE 9: Улучшения потокового API
В Java SE 9 корпорация Oracle добавила в java.util следующие четыре новых полезных метода.Потоковый интерфейс.
- Бросай, пока
- Возьми немного
- повторите
- обНуляемый
Поскольку поток является интерфейсом, первые два новых метода являются методами по умолчанию, а последние два-статическими методами. Два из них очень важны: методы dropWhile и takeWhile.
Если вы знакомы с языком Scala или любым другим языком программирования функций, вы определенно знаете об этих методах. Это очень полезные методы при написании некоторого кода функционального стиля. Давайте обсудим их один за другим с описанием и полезными примерами в следующих разделах.
Java SE 9: Метод Stream API takeWhile()
В потоковом API метод takeWhile() возвращает самые длинные префиксные элементы, соответствующие условию Предиката.
В качестве аргумента он принимает Предикат. Предикат-это логическое выражение, которое возвращает либо true, либо false. Он ведет себя по-разному для упорядоченных и неупорядоченных потоков. Давайте рассмотрим их на нескольких простых примерах ниже.
Потоковый API:-
default StreamtakeWhile(Predicate super T> predicate)
Если поток упорядочен, то метод takeWhile возвращает самый длинный префикс, соответствующий этому Предикату. Результирующий поток содержит только те элементы префикса, которые соответствуют этому условию Предиката.
Пример Упорядоченного Потока:-
jshell> Streamstream = Stream.of(1,2,3,4,5,6,7,8,9,10) stream ==> java.util.stream.ReferencePipeline$Head@55d56113 jshell> stream.takeWhile(x -> x < 4).forEach(a -> System.out.println(a)) 1 2 3
Поскольку этот поток является упорядоченным, метод takeWhile() возвращает первые три элемента, которые соответствуют нашему Предикату. Здесь наш предикат состоит в том, что “Элемент должен быть меньше 4”.
Пример Неупорядоченного Потока:-
jshell> Streamstream = Stream.of(1,2,4,5,3,6,7,8,9,10) stream ==> java.util.stream.ReferencePipeline$Head@55d56113 jshell> stream.takeWhile(x -> x < 4).forEach(a -> System.out.println(a)) 1 2
Поскольку этот поток является неупорядоченным, метод takeWhile() возвращает первые два элемента, которые соответствуют нашему Предикату.
Это означает, что функция takeWhile() возвращает все элементы с префиксами до тех пор, пока они не будут соответствовать условию предиката. Когда этот предикат возвращает значение false для первого элемента, он прекращает вычисление и возвращает элементы этого подмножества. Этот предикат вычисляется до тех пор, пока он не вернет значение false в первый раз.
Java SE 9: Метод отбрасывания API потока
В потоковом API метод dropWhile() удаляет самые длинные префиксные элементы, соответствующие Предикату, и возвращает остальные элементы.
В качестве аргумента он принимает Предикат. Предикат-это логическое выражение, которое возвращает либо true, либо false. Он ведет себя по-разному для упорядоченных и неупорядоченных потоков. Давайте рассмотрим их на нескольких простых примерах ниже.
Потоковый API:-
default StreamdropWhile(Predicate super T> predicate)
Если поток упорядочен, то метод dropWhile удаляет самые длинные элементы префикса, соответствующие этому Предикату, и возвращает остальные элементы. Результирующий поток содержит все элементы, кроме тех элементов с префиксами, которые соответствуют условию Предиката.
Пример Упорядоченного Потока:-
jshell> Streamstream = Stream.of(1,2,3,4,5,6,7,8,9,10) stream ==> java.util.stream.ReferencePipeline$Head@55d56113 jshell> stream.dropWhile(x -> x < 4).forEach(a -> System.out.println(a)) 4 5 6 7 8 9 10
Поскольку этот поток является упорядоченным, метод dropWhile() удаляет первые три элемента, которые соответствуют нашему Предикату, и возвращает остальные элементы в результирующий поток. Здесь наш предикат состоит в том, что “Элемент должен быть меньше 4”.
Пример Неупорядоченного Потока:-
jshell> Streamstream = Stream.of(1,2,4,5,3,6,7,8,9,10) stream ==> java.util.stream.ReferencePipeline$Head@55d56113 jshell> stream.dropWhile(x -> x < 4).forEach(a -> System.out.println(a)) 4 5 3 6 7 8 9 10
Поскольку этот поток является неупорядоченным, метод dropWhile() удаляет только первые два элемента, которые соответствуют нашему Предикату, и возвращает остальные элементы в результирующий поток.
Это означает, что dropWhile() сначала удаляет все элементы с префиксами до тех пор, пока они не будут соответствовать условию предиката. Когда этот предикат возвращает значение false для первого элемента, он прекращает вычисление и возвращает остальные элементы подмножества в результирующий поток.
Java SE 9: Метод итерации API потока
В потоковом API функция iterate() возвращает поток элементов, которые начинаются с начального значения (первый параметр), соответствуют Предикату (2-й параметр) и генерируют следующий элемент с использованием 3-го параметра.
Потоковый API:-
staticStream iterate(T seed, Predicate super T> hasNext, UnaryOperator next)
Это похоже на цикл for: первый параметр-начальное значение, следующий параметр-условие, а последний параметр-создание следующего элемента (например, операция приращения или уменьшения).
Пример итерации Java SE 9 в потоке:-
jshell> IntStream.iterate(2, x -> x < 20, x -> x * x).forEach(System.out::println) 2 4 16
Здесь поток начинается с элемента “2”, затем выполняется условие “2 < 20” верно, выводится значение. На следующей итерации увеличьте значение “2*”, проверьте, что условие “4 < 20” верно, выводит значение. И так далее, пока условие не вернет ложное значение.
Java SE 9's iterate() = Java SE 8's iterate() + Java SE 8's filter()
Java SE 8: Пример итерации и фильтрации в потоке:-
jshell> IntStream.iterate(2, x -> x * x).filter(x -> x < 20).forEach(System.out::println) 2 4 16
Java SE 9: Потоковый API метода, допускающего значение NULL
В потоковом API функция ofNullable() возвращает последовательный поток, содержащий один элемент, если он не равен нулю, в противном случае возвращает пустой поток.
Пример Java SE 9:-
jshell> Streams = Stream.ofNullable(1) s ==> java.util.stream.ReferencePipeline$Head@1e965684 jshell> s.forEach(System.out::println) 1 jshell> Stream s = Stream.ofNullable(null) s ==> java.util.stream.ReferencePipeline$Head@3b088d51 jshell> s.forEach(System.out::println) jshell>
ПРИМЕЧАНИЕ:- Подинтерфейсы потока (например, IntStream, LongStream и т. Д.) Наследуют все эти 4 новых метода.
Вот и все о новой функции “Java SE 9: Улучшения потокового API”. Мы обсудим еще несколько новых функций Java SE 9 в моих следующих постах.
Пожалуйста, напишите мне комментарий, если вам нравится мой пост или у вас есть какие-либо вопросы/предложения/ошибки типа.
Спасибо, что прочитали мои учебные пособия.
Счастливого Обучения Java SE 9!