← Назад к вопросам

Какие знаешь промежуточные операции?

2.0 Middle🔥 241 комментариев
#Stream API и функциональное программирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Промежуточные операции в Stream API

Промежуточные операции (intermediate operations) возвращают новый Stream и не выполняют вычисления сразу. Выполняются только при вызове терминальной операции (collect, forEach, count).

map() - преобразование элементов

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squared = numbers.stream()
    .map(n -> n * n)
    .collect(Collectors.toList());
// Результат: [1, 4, 9, 16]

filter() - фильтрация

List<Integer> evens = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());
// Результат: [2, 4]

flatMap() - развёртывание потоков

List<List<Integer>> nested = Arrays.asList(
    Arrays.asList(1, 2),
    Arrays.asList(3, 4)
);
List<Integer> flat = nested.stream()
    .flatMap(List::stream)
    .collect(Collectors.toList());
// Результат: [1, 2, 3, 4]

distinct() - удаление дубликатов

List<Integer> unique = Arrays.asList(1, 2, 2, 3, 3, 4).stream()
    .distinct()
    .collect(Collectors.toList());
// Результат: [1, 2, 3, 4]

sorted() - сортировка

List<Integer> sorted = numbers.stream()
    .sorted()
    .collect(Collectors.toList());

List<User> byAge = users.stream()
    .sorted(Comparator.comparing(User::getAge))
    .collect(Collectors.toList());

limit() и skip()

List<Integer> first3 = numbers.stream()
    .limit(3)
    .collect(Collectors.toList());

List<User> page = users.stream()
    .skip((pageNumber - 1) * pageSize)
    .limit(pageSize)
    .collect(Collectors.toList());

peek() - просмотр для отладки

List<Integer> result = numbers.stream()
    .peek(n -> System.out.println("Processing: " + n))
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());

Главное свойство: Lazy evaluation

Промежуточные операции не выполняются пока не вызвана терминальная операция:

Stream<Integer> stream = numbers.stream()
    .filter(n -> {
        System.out.println("Filtering: " + n);
        return n > 2;
    })
    .map(n -> {
        System.out.println("Mapping: " + n);
        return n * 2;
    });
// На этот момент ничего не печатается!

List<Integer> result = stream.collect(Collectors.toList());
// Вот здесь вычисляется всё

Цепочка операций

List<String> result = users.stream()
    .filter(u -> u.getAge() >= 18)
    .filter(u -> u.getRole() == Role.ADMIN)
    .map(User::getName)
    .sorted()
    .distinct()
    .collect(Collectors.toList());

Основные промежуточные операции: map, filter, flatMap, distinct, sorted, limit, skip, peek. Все они возвращают Stream и выполняются лениво (lazy evaluation) только при вызове терминальной операции. map vs flatMap - один из частых вопросов на собеседованиях.