Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: Java, Stream API, functional programming, lambda expressions, intermediate operations, terminal operations

Какие основные операции Stream API вы знаете?

Вопрос проверяет знание основных операций Stream API в Java, которые используются для функциональной обработки коллекций и данных.

Короткий ответ

Stream API в Java предоставляет набор операций для обработки последовательностей данных в функциональном стиле. Основные операции делятся на промежуточные (например, filter, map, sorted) и терминальные (например, forEach, collect, reduce). Промежуточные операции преобразуют поток и возвращают новый поток, позволяя строить цепочки вызовов. Терминальные операции завершают поток и возвращают результат или производят побочный эффект. Это позволяет писать более декларативный и читаемый код для работы с коллекциями.

Длинный ответ

Stream API, появившийся в Java 8, представляет собой мощный инструмент для обработки последовательностей данных (например, коллекций) в функциональном стиле. Он позволяет выражать сложные операции обработки данных в виде цепочек вызовов, что делает код более декларативным, лаконичным и часто более производительным за счёт возможностей ленивого выполнения и параллельной обработки.

Категории операций Stream API

Операции Stream API делятся на две основные группы:

  • Промежуточные операции (Intermediate operations): Они преобразуют элементы потока и возвращают новый поток. Эти операции "ленивые" — они не выполняются до вызова терминальной операции. Это позволяет оптимизировать обработку.
  • Терминальные операции (Terminal operations): Они завершают поток, запуская обработку всех промежуточных операций, и возвращают результат (например, коллекцию, значение или void). После вызова терминальной операции поток считается потреблённым и больше не может быть использован.

Основные промежуточные операции

  • filter(Predicate<T>): Отфильтровывает элементы, не соответствующие заданному условию.
  • map(Function<T, R>): Преобразует каждый элемент потока в другой объект (например, извлекает поле).
  • sorted() / sorted(Comparator<T>): Сортирует элементы потока.
  • distinct(): Удаляет дубликаты элементов (использует equals()).
  • limit(long n): Ограничивает поток первыми n элементами.
  • skip(long n): Пропускает первые n элементов потока.
  • peek(Consumer<T>): Выполняет действие для каждого элемента (часто для отладки), не изменяя элементы.

Основные терминальные операции

  • forEach(Consumer<T>): Выполняет действие для каждого элемента потока.
  • collect(Collector): Преобразует элементы потока в другую структуру, например, в List, Set или Map. Часто используется с Collectors.toList().
  • reduce(): Сворачивает элементы потока в одно значение (например, сумму или конкатенацию).
  • count(): Возвращает количество элементов в потоке.
  • anyMatch() / allMatch() / noneMatch(Predicate<T>): Проверяют, удовлетворяют ли элементы потока заданному условию.
  • findFirst() / findAny(): Возвращают Optional с элементом потока.
  • min() / max(Comparator<T>): Находят минимальный или максимальный элемент.

Пример кода

Рассмотрим пример, который объединяет несколько операций:

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 следует применять для декларативной обработки коллекций и данных, особенно когда нужны операции фильтрации, преобразования, агрегации или сортировки. Он делает код чище и часто эффективнее, особенно при использовании параллельных потоков для больших наборов данных. Однако для простых циклов или когда важна максимальная производительность в мельчайших деталях, традиционные циклы могут быть предпочтительнее.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Java

    Java

Ключевые слова

#Java

#Stream API

#functional programming

#lambda expressions

#intermediate operations

#terminal operations

Подпишись на Java Developer в телеграм