JavaStart
934 subscribers
879 photos
26 videos
589 links
Учи Java вместе с нами!
Наша платформа с курсом - https://javastart.tech
Ютуб с обучающими видео - https://www.youtube.com/@javastart_tech
Download Telegram
Лямбда-выражение в Java. Часть 2.

Рассмотрим еще один пример создания лямбда-выражения.

У нас есть некий интерфейс CarFilter с абстрактным методом test(Car car), который каким-то образом должен тестировать/фильтровать наши машины (и мы еще не решили как). Смотрим на Картинку 1.

Допустим, нам нужна реализация нашего интерфейса CarFilter, описанного выше, которая проверяла бы, что автомобиль выпущен не раньше 2010 года. Если мы будем использовать анонимный класс, то создание объекта этого класса, который реализует наш интерфейс CarFilter, будет выглядеть примерно как на Картинке 2.

Но мы можем описать объект, реализующий наш интерфейс CarFilter, при помощи лямбда-выражения (Картинка 3, сверху).

Однако, эту запись можно сделать ещё меньше как на Картинке 3, снизу.

Согласитесь, что такая запись значительно меньше и лаконичнее, чем использование анонимного класса.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
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. Часть 3.

Применение лямбда-выражений.

Допустим у нас есть задача написать метод, выводящий из полученного списка автомобили, у которых тип кузова (body) — STATION_WAGON и мощность (power) — больше 200 л.с.

Скорее всего, мы напишем что-то вроде того, что на Картинке 1.

В целом, если нам требуется всего один подобный метод, то этот код можно оставить без изменений и даже не задумываться об использовании лямбда-выражений.

Но, допустим, у нас появляется задача реализовать ещё один метод, который бы выводил все автомобили, у которых кузов не PICKUP_TRUCK, или метод, который бы сохранял в БД все автомобили с мощностью двигателя более 150 л.с.

В этом случае логично было бы использовать сразу два функциональных интерфейса из  пакета java.util.function:

– java.util.function.Predicate — для фильтрации

и

– java.util.function.Consumer — для действия, применяемого к подходящим объектам.

java.util.function.Predicate декларирует абстрактный метод test(), который принимает объект и возвращает значение типа boolean в зависимости от соответствия переданного объекта требуемым критериям.

java.util.function.Consumer декларирует абстрактный метод accept(), который принимает объект и выполняет над ним требуемые действия.

Метод printCars(List<Car> cars) превратится во что-то похожее на следующий метод, написанный на Картинке 2.

И первоначальную задачу вывести из полученного списка автомобили, у которых тип кузова (body) — STATION_WAGON и мощность (power) — больше 200 л.с. мы решили бы следующим вызовом метода processCars() с использованием лямбда-выражений (Картинка 3).

Или при помощи анонимных классов как на Картинке 4.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
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. Часть 4.

Как уже было написано, лямбда-выражения могут заменить анонимные классы, которые реализуют функциональные интерфейсы, но в остальных случаях анонимные классы не теряют актуальности.

Если одно и то же лямбда-выражение (или анонимный класс) используется в нескольких случаях, то появляется смысл сделать его членом класса или объекта, или и вовсе написать полноценный класс, реализующий необходимый интерфейс.

Но в большинстве случаев, там где можно применять лямбда-выражения, например в Stream (поговорим далее), Optional (поговорим далее) или CompletableFuture (работа с асинхронностью), логичнее применять именно лямбды.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Stream API в Java. Часть 1.

Поговорим об одном из самых важных разделов Java, о котором обязательно спрашивают джунов или стажеров на собеседовании - это Stream API.

Stream API называют фреймворк для работы со структурами данных в функциональном стиле. Появился в Java 8 вместе с лямбда-выражениями, а это было аж в 2014 году.

Stream (поток) API (описание способов, которыми одна компьютерная программа может взаимодействовать с другой программой) — это по своей сути поток данных.

С появлением в Java 8 Stream API позволило программистам писать существенно короче то, что раньше занимало много строк кода, а именно — упростить работу с наборами данных, в частности, упростить операции фильтрации, сортировки и другие манипуляции с данными. Например, с коллекциями (List, Map, array и др.).

C чего, собственно, начать?

С создания экземпляра Stream, который опирается на нужную нам коллекцию, откуда соответственно будут браться данные, и метод .stream().

А далее со стримом можно делать все необходимое – об этом в след постах.

👩‍💻 Наш практический курс Java–разработчика

JavaStart. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
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. Подписаться
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. Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM