Вопрос проверяет знание основных операций Stream API в Java, которые используются для функциональной обработки коллекций и данных.
Stream API, появившийся в Java 8, представляет собой мощный инструмент для обработки последовательностей данных (например, коллекций) в функциональном стиле. Он позволяет выражать сложные операции обработки данных в виде цепочек вызовов, что делает код более декларативным, лаконичным и часто более производительным за счёт возможностей ленивого выполнения и параллельной обработки.
Операции Stream API делятся на две основные группы:
Рассмотрим пример, который объединяет несколько операций:
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<String> names = List.of("Anna", "Bob", "Alice", "David", "Alex");
// Цепочка операций: фильтрация, преобразование, сортировка, сбор в список.
List<String> result = names.stream() // Создание потока
.filter(name -> name.startsWith("A")) // Промежуточная: оставить имена на "A"
.map(String::toUpperCase) // Промежуточная: преобразовать в верхний регистр
.sorted() // Промежуточная: сортировка по алфавиту
.collect(Collectors.toList()); // Терминальная: сбор в список
System.out.println(result); // [ALEX, ALICE, ANNA]
}
}В этом примере создаётся поток из списка имён. Операция filter оставляет только имена, начинающиеся на "A". Затем map преобразует каждое имя в верхний регистр, sorted сортирует их, и наконец collect собирает результат в новый список. Все промежуточные операции выполняются "лениво", фактическая обработка запускается только при вызове collect.
Вывод: Stream API следует применять для декларативной обработки коллекций и данных, особенно когда нужны операции фильтрации, преобразования, агрегации или сортировки. Он делает код чище и часто эффективнее, особенно при использовании параллельных потоков для больших наборов данных. Однако для простых циклов или когда важна максимальная производительность в мельчайших деталях, традиционные циклы могут быть предпочтительнее.