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