Что возвращает метод filter() при вызове у stream() в Java?

«Что возвращает метод filter() при вызове у stream() в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод 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() и др.