https://youtu.be/VDx5x-BHdcY

СОДЕРЖАНИЕ

Что такое Stream?

Как вы знаете, stream – это поток. Вообще, в Java много всяких потоков. Вот недавно мы закончили небольшой блок про многопоточность. Мы говорили о потоках в программе, которые могут выполнять блоки кода одновременно. Обычно они называются Thread, тут вряд ли их можно перепутать. Есть еще потоки записи и чтения данных. Они тоже Stream, но I/O - input/output (потоки ввода/вывода). Они используются для, например, чтения и записи файлов.

А на этом уроке мы говорим о потоках которые так и называются Stream API и позволяют легко работать с данными в коллекциях. Они находятся в java.util.stream и были добавлены в JDK 8. Иногда, в русскоязычных переводах этот класс называется “потоковый API”. Stream API преобразует массив или коллекцию в поток данных, при этом, никаких изменений с исходным массивом не происходит, скорее наоборот - результатом работы stream API над данными будет новая коллекция.

Вообще, Stream API любимый способ всех Java разработчиков работы с коллекциями. Этот способ изящно и удобно позволяет вам отфильтровать, преобразовать, объединить данные, а так же выгодно отличает код middle/senior от типичного junior. В этом уроке мы посмотрим как можно резко повысить качество и читабельность своего кода, получить дополнительные очки на любом интервью и тестовом задании.

Stream API и лямбда выражения

Зачем мы на прошлом уроке сначала разобрали лямбда выражения и функциональные интерфейсы? Потому что в интерфейсе Stream есть методы, которые можно переопределять тем самым лямбда выражением! Сейчас посмотрим как это выглядит, но идея такая - говорим, фильтруем элементы (вызываем метод filter) и дальше уже в лямбда выражение говорим как именно фильтруем - ведь каждую коллекцию нужно фильтровать по-разному, так?

Оператор двойное двоеточие

Этот оператор был добавлен так же в JDK 8. Выглядит он вот так для статического контекста (для вызова статического метода):

ИмяКласса :: имяМетода

System.out::println

Для не статического вызова (вызов метода у объекта):

имяПеременнойОбъекта::имяМетода

player1::isActive

Формально, это укороченная запись лямбда выражения или ссылка на метод:

1 -> System.out.println(1);

В современных версиях Idea она будет сама вам подсказывать возможности замены лямбда выражения на двойное двоеточие.