На этом шаге мы начнем знакомиться со Stream Api
Stream - это последовательность элементов (возможно бесконечная) с поддержкой различных преобразований. Рассмотрим следующий пример:
List<User> users = getAllUsers();
System.out.println("Все пользователи");
users.forEach(System.out::println);
System.out.println("\nСписок пользователей (первые 3), возраст которых больше 10");
users.stream()
.filter(u -> u.getAge() > 10)
.sorted(Comparator.comparing(User::getName))
.limit(3)
.forEach(System.out::println);В данном фрагменте программы с помощью функции getAllUsers получаем список пользователей (список объектов типа User). В объекте типа User хранится информация о имени пользователя и его возраст. Получить имя пользователя можно с помощью функции getName, а возраст с помощью функции getAge. С помощью данного фрагмента программы мы получаем три первых (в алфавитном порядке) пользователя, у которых возраст больше 10.
При работе со Stream Api задаются 3 компонента:
Источником в данном примере является список users. Промежуточные операции данном примере - это функции filter, sorted и limit. Есть одна особенность промежуточных функций - они “ленивые”. Данные функции на самом деле не выполняют ничего с источником. Они лишь задают “рецепт” конструирования новой последовательности элементов. Заметим, что каждая промежуточная функция возвращает объект типа Stream. Это позволяет строить целые цепочки вызовов таких функций, как это показано в примере выше. Все действия с “рецептами” происходят в терминальной функции. Данная функция всегда является последней функцией в цепочке вызовов. Такая функция уже возвращает объект, отличный от Stream (возможно даже void). В нашем случае это функция forEach, с помощью которой мы проходим по полученному списку и выводим его на экран.
Для того, чтобы убедиться что промежуточные функции не выполняются, пока не будет вызвана терминальная функция, наберите следующий пример:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
System.out.println("Вывод начался");
list.stream().filter(value -> {
System.out.println(value);
return value % 2 == 0;
});
System.out.println("Вывод закончился");
/* Output:
Вывод начался
Вывод закончился
*/На следующем шаге мы поговорим про источников типа Stream