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.
👉 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.
👉 JavaStart. Подписаться
👍8❤3⚡2🔥1👨💻1
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]
Ну как? Старался объяснять максимально понятно!)
Рассмотрим еще примеры в следующих постах.
👉 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]
Ну как? Старался объяснять максимально понятно!)
Рассмотрим еще примеры в следующих постах.
👉 JavaStart. Подписаться
🔥10👍5❤3✍1
Что такое конструктор в Java?
Anonymous Quiz
6%
Метод, который вызывается при изменении объекта
2%
Метод, который вызывается при удалении объекта
91%
Метод, который вызывается при создании объекта
2%
Посмотреть ответ
👍8❤2🔥2🎉1
Stream API в Java. Часть 6.
В Stream API Java пока мы не вызвали терминальный метод, ничего не происходит. Все потому, что конвейерные методы ленятся (они lazy). Это значит, что они обрабатывают данные и ждут команды, чтобы передать их терминальному методу.
Перечислю часто встречающиеся Конвейерные (или Промежуточные) операторы стримов:
👉 JavaStart. Подписаться
В Stream API Java пока мы не вызвали терминальный метод, ничего не происходит. Все потому, что конвейерные методы ленятся (они lazy). Это значит, что они обрабатывают данные и ждут команды, чтобы передать их терминальному методу.
Перечислю часто встречающиеся Конвейерные (или Промежуточные) операторы стримов:
👉 JavaStart. Подписаться
👍10🔥4✍1❤1🫡1
Что такое интерфейс в Java?
Anonymous Quiz
2%
Механизм обработки исключительных ситуаций
25%
Список доступных методов и свойств объекта
69%
Класс, определяющий общие методы для группы классов
3%
Посмотреть ответ
👍10🔥2⚡1👏1😱1
Stream API в Java. Часть 7.
После того как мы поработали с нашим стримом (или потоком) каких-либо элементов (стрим списка любых кастомных моделек Java, например, класс Car или просто список строк или объектов Integer) нужно завершить эту работу с помощью терминального оператора.
Перечислю часто встречающиеся Терминальные операторы стримов в Java.
👉 JavaStart. Подписаться
После того как мы поработали с нашим стримом (или потоком) каких-либо элементов (стрим списка любых кастомных моделек Java, например, класс Car или просто список строк или объектов Integer) нужно завершить эту работу с помощью терминального оператора.
Перечислю часто встречающиеся Терминальные операторы стримов в Java.
👉 JavaStart. Подписаться
👍8✍1❤1🔥1
Stream API в Java. Часть 8.
Подробнее изучите метод .collect(). Он позволяет гибко управлять преобразованием значений в разные типы: коллекции, массивы, map. Делается это благодаря статистическим методам Collectors.
Вот несколько интересных примеров:
toList — стрим приводится к списку;
toCollection — получаем коллекцию;
toSet — получаем множество;
toConcurrentMap, toMap — если нужен map;
summingInt, summingDouble, summingLong — если требуется получить сумму чисел;
averagingInt, averagingDouble, averagingLong — если хотите вернуть среднее значение;
groupingBy — если необходимо разбить коллекцию на части.
Это не все статистические методы Collectors. Другие возможности с подробным описанием смотрите в документации (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html). Помимо тех Collectors, которые определены в документации, можно использовать собственноручно созданные, кастомные варианты)
👉 JavaStart. Подписаться
Подробнее изучите метод .collect(). Он позволяет гибко управлять преобразованием значений в разные типы: коллекции, массивы, map. Делается это благодаря статистическим методам Collectors.
Вот несколько интересных примеров:
toList — стрим приводится к списку;
toCollection — получаем коллекцию;
toSet — получаем множество;
toConcurrentMap, toMap — если нужен map;
summingInt, summingDouble, summingLong — если требуется получить сумму чисел;
averagingInt, averagingDouble, averagingLong — если хотите вернуть среднее значение;
groupingBy — если необходимо разбить коллекцию на части.
Это не все статистические методы Collectors. Другие возможности с подробным описанием смотрите в документации (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html). Помимо тех Collectors, которые определены в документации, можно использовать собственноручно созданные, кастомные варианты)
👉 JavaStart. Подписаться
👍6✍1❤1⚡1🔥1👨💻1
Stream API в Java. Часть 9.
Давайте поиграемся с методами .min() и .max().
Пусть у нас будет коллекция строк вида Arrays.asList("f10", "f15", "f2", "f4").
Нужно найти самый маленький элемент:
collection.stream().min(String::compareTo).get()
// f2
Метод compareTo() – это метод, который есть у каждого объекта типа String.
С максимальным значением тоже все очень просто:
collection.stream().max(String::compareTo).get()
// f15
👉 JavaStart. Подписаться
Давайте поиграемся с методами .min() и .max().
Пусть у нас будет коллекция строк вида Arrays.asList("f10", "f15", "f2", "f4").
Нужно найти самый маленький элемент:
collection.stream().min(String::compareTo).get()
// f2
Метод compareTo() – это метод, который есть у каждого объекта типа String.
С максимальным значением тоже все очень просто:
collection.stream().max(String::compareTo).get()
// f15
👉 JavaStart. Подписаться
👍6❤3🔥1👨💻1