Ответ
Метод stream().filter() возвращает новый объект Stream<T>, содержащий только элементы исходной коллекции, удовлетворяющие условию предиката. Исходная коллекция (например, ArrayList) при этом не изменяется.
Важно: filter() — это промежуточная операция. Она «ленива» и не выполняется без терминальной операции.
Пример:
import java.util.*;
import java.util.stream.*;
public class Example {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
// 1. Только filter() — ничего не происходит (ленивое вычисление)
Stream<Integer> filteredStream = numbers.stream().filter(n -> n > 2);
System.out.println("Исходный список: " + numbers); // [1, 2, 3, 4, 5]
// 2. Применение терминальной операции collect()
List<Integer> result = numbers.stream()
.filter(n -> n > 2)
.collect(Collectors.toList());
System.out.println("Результат: " + result); // [3, 4, 5]
System.out.println("Исходный список после: " + numbers); // [1, 2, 3, 4, 5] (не изменился)
}
}
Вывод: filter() сам по себе не производит вычислений и не меняет данные. Он создает конвейер для обработки, который активируется терминальными операциями: collect(), forEach(), count() и др.