Ответ
Поток (Stream) в Java состоит из трех логических частей, образующих конвейер обработки:
1. Источник (Source) Создает поток из данных. Источники бывают:
- Коллекции:
collection.stream() - Массивы:
Arrays.stream(array) - Значения:
Stream.of("a", "b", "c") - Файлы:
Files.lines(path) - Генераторы:
Stream.iterate(),Stream.generate()
2. Промежуточные операции (Intermediate Operations) Преобразуют элементы потока, возвращая новый поток. Ленивые — выполняются только при вызове терминальной операции.
filter(Predicate<T>)— фильтрация.map(Function<T, R>)— преобразование.sorted()— сортировка.distinct()— удаление дубликатов.limit(long n)— ограничение количества элементов.
3. Терминальная операция (Terminal Operation) Завершает поток, запускает выполнение всего конвейера и производит результат или побочный эффект. Энергичная.
collect(Collector)— агрегация в коллекцию.forEach(Consumer)— выполнение действия для каждого элемента.reduce()— свертка к одному значению.count(),anyMatch(),findFirst()— получение результата.
Пример конвейера:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Anna");
List<String> result = names.stream() // Источник
.filter(name -> name.startsWith("A")) // Промежуточная операция
.map(String::toUpperCase) // Промежуточная операция
.collect(Collectors.toList()); // Терминальная операция
// result = ["ALICE", "ANNA"]