Stream API в Java. Часть 2.
Давайте рассмотрим применение Stream API на самом простом примере, но который можно считать вполне боевым (из коммерческой разработки).
Предположим, у нас есть список интовых чисел и нам нужно вывести конкретные числа из списка, подходящие под наш алгоритм:
Берем сначала все числа меньше 90, прибавляем к каждому числу цифру 10, выводим первые 3 числа из получившегося списка.
На выходе в консоли мы получаем числа 60, 70 и 80.
Пример без потока на Картинке 1.
Обратите внимание, насколько код читабельнее и лаконичнее с применением Stream API на Картинке 2.
Рассмотрим подробнее Картинку 2. Что мы там делаем?
– Создаем стрим (поток) целых чисел из данного списка с помощью метода .stream();
– Фильтруем наш поток чисел методом .filter(условие). Берем только те, которые меньше 90. Переменная x приравнивается к одному элементу коллекции для перебора;
– Прибавляем к каждому полученному в потоке числу цифру 10 с помощью Stream метода .map(операция). Переменная x приравнивается к одному элементу коллекции для перебора;
– Ограничиваем наш конечный поток только 3-мя элементами (числами в нашем случае) с помощью метода .limit(число);
– Печатаем в консоль каждый элемент, который присутствует в конечном потоке. Выражение System.out::println сокращенно от:
x -> System.out.println(x)).
Много интересных методов, которых нам предоставляет фреймворк Stream API)
Рассмотрим их далее в постах.
Кстати, для лучшей читабельности методы стрима принято писать с новой строки. Но это не обязательно.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Давайте рассмотрим применение Stream API на самом простом примере, но который можно считать вполне боевым (из коммерческой разработки).
Предположим, у нас есть список интовых чисел и нам нужно вывести конкретные числа из списка, подходящие под наш алгоритм:
Берем сначала все числа меньше 90, прибавляем к каждому числу цифру 10, выводим первые 3 числа из получившегося списка.
На выходе в консоли мы получаем числа 60, 70 и 80.
Пример без потока на Картинке 1.
Обратите внимание, насколько код читабельнее и лаконичнее с применением Stream API на Картинке 2.
Рассмотрим подробнее Картинку 2. Что мы там делаем?
– Создаем стрим (поток) целых чисел из данного списка с помощью метода .stream();
– Фильтруем наш поток чисел методом .filter(условие). Берем только те, которые меньше 90. Переменная x приравнивается к одному элементу коллекции для перебора;
– Прибавляем к каждому полученному в потоке числу цифру 10 с помощью Stream метода .map(операция). Переменная x приравнивается к одному элементу коллекции для перебора;
– Ограничиваем наш конечный поток только 3-мя элементами (числами в нашем случае) с помощью метода .limit(число);
– Печатаем в консоль каждый элемент, который присутствует в конечном потоке. Выражение System.out::println сокращенно от:
x -> System.out.println(x)).
Много интересных методов, которых нам предоставляет фреймворк Stream API)
Рассмотрим их далее в постах.
Кстати, для лучшей читабельности методы стрима принято писать с новой строки. Но это не обязательно.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой символ используется, чтобы разделить ключ и значение в JSON?
Anonymous Quiz
65%
:
10%
;
11%
,
9%
=
5%
Посмотреть ответ
Stream API в Java. Часть 3.
Возможные способы создания Stream:
– Пустой стрим: Stream.empty()
– Стрим из List: list.stream()
– Стрим из Map: map.entrySet().stream()
– Стрим из массива: Arrays.stream(array)
– Стрим из указанных элементов (в данном случае строк – в ковычках): Stream.of("1", "2", "3")
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Возможные способы создания Stream:
– Пустой стрим: Stream.empty()
– Стрим из List: list.stream()
– Стрим из Map: map.entrySet().stream()
– Стрим из массива: Arrays.stream(array)
– Стрим из указанных элементов (в данном случае строк – в ковычках): Stream.of("1", "2", "3")
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Какое предназначение у команды WHERE в SQL?
Anonymous Quiz
27%
Указывает столбцы, которые необходимо извлечь
1%
Упорядочивает результаты в порядке возрастания или убывания
71%
Фильтрует строки, возвращаемые оператором SELECT
0%
Создаёт новую таблицу
2%
Посмотреть ответ
Stream API в Java. Часть 4.
По сути методы класса Stream называются операторами.
Вопрос о видах Stream операторов часто всплывает на собеседованиях Java джунам или стажерам. Чтобы понимать, насколько вы знаете теорию.
Операторы можно разделить на две группы:
– Промежуточные (“intermediate”, ещё называют “lazy”) — обрабатывают поступающие элементы и возвращают стрим. Промежуточных операторов в цепочке обработки элементов может быть много. В некоторых источниках Промежуточные операторы называются Конвейерными.
– Терминальные (“terminal”, ещё называют “eager”) — обрабатывают элементы и завершают работу стрима, так что терминальный оператор в цепочке может быть только один.
Что происходит на первой картинке?
– Создаём список list;
– Заполняем его тестовыми данными;
– Создаем стрим;
– Метод .filter() (фильтр) — промежуточный оператор, переменная x приравнивается к одному элементу коллекции для перебора (как при for each) и после -> мы указываем как фильтруется наша коллекция и так как это промежуточный оператор, отфильтрованная коллекция идёт дальше в метод .forEach(), который в свою очередь, является терминальным (конечным) аналогом перебора for each.
Выражение System.out::println сокращенно от:
x -> System.out.println(x),
которое в свою очередь, проходит по всем элементам переданной ему коллекции и выводит её.
– На выходе получаем строку One.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
По сути методы класса Stream называются операторами.
Вопрос о видах Stream операторов часто всплывает на собеседованиях Java джунам или стажерам. Чтобы понимать, насколько вы знаете теорию.
Операторы можно разделить на две группы:
– Промежуточные (“intermediate”, ещё называют “lazy”) — обрабатывают поступающие элементы и возвращают стрим. Промежуточных операторов в цепочке обработки элементов может быть много. В некоторых источниках Промежуточные операторы называются Конвейерными.
– Терминальные (“terminal”, ещё называют “eager”) — обрабатывают элементы и завершают работу стрима, так что терминальный оператор в цепочке может быть только один.
Что происходит на первой картинке?
– Создаём список list;
– Заполняем его тестовыми данными;
– Создаем стрим;
– Метод .filter() (фильтр) — промежуточный оператор, переменная x приравнивается к одному элементу коллекции для перебора (как при for each) и после -> мы указываем как фильтруется наша коллекция и так как это промежуточный оператор, отфильтрованная коллекция идёт дальше в метод .forEach(), который в свою очередь, является терминальным (конечным) аналогом перебора for each.
Выражение System.out::println сокращенно от:
x -> System.out.println(x),
которое в свою очередь, проходит по всем элементам переданной ему коллекции и выводит её.
– На выходе получаем строку One.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Stream API в Java. Часть 5.
Давайте рассмотрим на практике, на примере несложных задач, как работать с разными методами Stream API.
Допустим, у нас есть коллекция состоящая из строк:
List<String> strings = Arrays.asList("Highload", "High", "Load", "Highload").
Применим к ней разные методы.
1) Посчитаем, сколько раз объект "High" встречается в коллекции:
strings.stream().filter("High"::equals).count()
// 1
equals – это метод, который есть у каждого объекта типа String.
2) А теперь посмотрим, какой элемент в коллекции находится на первом месте. Если мы получили пустую коллекцию, то пусть возвращается 0:
strings.stream().findFirst().orElse("0")
// Highload
3) Благодаря методам .filter(условие) и .findFirst() можно находить элементы, равные заданным в условии:
strings.stream().filter("Load"::equals).findFirst().get()
// Load
4) С помощью метода .skip(число long) можно искать элементы по порядку. Например, пропустить первый и вывести второй:
strings.stream().skip(1).findFirst().get()
// High
5) Можно также использовать методы .skip(число long) и .limit(число long), чтобы явно задавать, сколько элементов нужно пропустить, а сколько — вернуть. Полученные значения соберем в массив:
strings.stream().skip(1).limit(2).toArray()
// [High, Load]
Рассмотрим еще примеры в следующих постах.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Давайте рассмотрим на практике, на примере несложных задач, как работать с разными методами Stream API.
Допустим, у нас есть коллекция состоящая из строк:
List<String> strings = Arrays.asList("Highload", "High", "Load", "Highload").
Применим к ней разные методы.
1) Посчитаем, сколько раз объект "High" встречается в коллекции:
strings.stream().filter("High"::equals).count()
// 1
equals – это метод, который есть у каждого объекта типа String.
2) А теперь посмотрим, какой элемент в коллекции находится на первом месте. Если мы получили пустую коллекцию, то пусть возвращается 0:
strings.stream().findFirst().orElse("0")
// Highload
3) Благодаря методам .filter(условие) и .findFirst() можно находить элементы, равные заданным в условии:
strings.stream().filter("Load"::equals).findFirst().get()
// Load
4) С помощью метода .skip(число long) можно искать элементы по порядку. Например, пропустить первый и вывести второй:
strings.stream().skip(1).findFirst().get()
// High
5) Можно также использовать методы .skip(число long) и .limit(число long), чтобы явно задавать, сколько элементов нужно пропустить, а сколько — вернуть. Полученные значения соберем в массив:
strings.stream().skip(1).limit(2).toArray()
// [High, Load]
Рассмотрим еще примеры в следующих постах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое интерфейс в Java?
Anonymous Quiz
1%
Механизм обработки исключительных ситуаций
28%
Список доступных методов и свойств объекта
69%
Класс, определяющий общие методы для других классов
2%
Посмотреть ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой будет результат работы следующей программы, используя Stream API Java?
✅ JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
👆Объяснение к задаче выше:
Сначала создаётся список целых чисел из массива 1, 2, 3, 4, 5.
Затем этот список превращается в поток данных (Stream).
Далее выполняется фильтрация, оставляя только чётные числа (остаток при делении на 2 равен нулю).
Затем происходит преобразование каждого элемента потока в примитивный тип int, используя метод mapToInt().
Наконец, выполняется операция суммирования всех элементов потока с помощью метода sum().
В результате мы получаем сумму чётных чисел в списке, равную 6.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
Сначала создаётся список целых чисел из массива 1, 2, 3, 4, 5.
Затем этот список превращается в поток данных (Stream).
Далее выполняется фильтрация, оставляя только чётные числа (остаток при делении на 2 равен нулю).
Затем происходит преобразование каждого элемента потока в примитивный тип int, используя метод mapToInt().
Наконец, выполняется операция суммирования всех элементов потока с помощью метода sum().
В результате мы получаем сумму чётных чисел в списке, равную 6.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Stream API в Java. Часть 6.
В Stream API Java пока мы не вызвали терминальный метод, ничего не происходит. Все потому, что конвейерные методы ленятся (они lazy). Это значит, что они обрабатывают данные и ждут команды, чтобы передать их терминальному методу.
Перечислим часто встречающиеся Конвейерные (или Промежуточные) операторы стримов.
👩💻 Наш практический курс Java–разработчика
✅ JavaStart. Подписаться
В Stream API Java пока мы не вызвали терминальный метод, ничего не происходит. Все потому, что конвейерные методы ленятся (они lazy). Это значит, что они обрабатывают данные и ждут команды, чтобы передать их терминальному методу.
Перечислим часто встречающиеся Конвейерные (или Промежуточные) операторы стримов.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM