Рубрики
Без рубрики

Java SE 9: Улучшения потокового API

Опубликуйте краткое содержание: Введение Java SE 8: Основы потокового API Java SE 9: Улучшения потокового API Java SE 9: Метод takeWhile() потокового API Java SE

Автор оригинала: 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 Stream takeWhile(Predicate predicate)

Если поток упорядочен, то метод takeWhile возвращает самый длинный префикс, соответствующий этому Предикату. Результирующий поток содержит только те элементы префикса, которые соответствуют этому условию Предиката.

Пример Упорядоченного Потока:-

jshell> Stream stream = 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> Stream stream = 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 Stream dropWhile(Predicate predicate)

Если поток упорядочен, то метод dropWhile удаляет самые длинные элементы префикса, соответствующие этому Предикату, и возвращает остальные элементы. Результирующий поток содержит все элементы, кроме тех элементов с префиксами, которые соответствуют условию Предиката.

Пример Упорядоченного Потока:-

jshell> Stream stream = 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> Stream stream = 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:-

static  Stream iterate(T seed, Predicate 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> Stream s = 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!