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

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

1️⃣ Как кратко ответить

Промежуточные операции в Stream API — это операции, которые преобразуют поток данных и возвращают новый поток. Примеры таких операций: filter(), map(), sorted(), distinct(), limit(), skip(). Они ленивы и выполняются только при вызове терминальной операции.

2️⃣ Подробное объяснение темы

Stream API в Java предоставляет мощный инструмент для работы с последовательностями данных. Промежуточные операции — это ключевой компонент Stream API, который позволяет преобразовывать и фильтровать данные в потоке. Эти операции всегда возвращают новый поток, что позволяет их комбинировать в цепочки.

Зачем нужны промежуточные операции?

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

  • Фильтровать данные, оставляя только те элементы, которые соответствуют определенным условиям.
  • Преобразовывать данные из одного типа в другой.
  • Упорядочивать данные.
  • Удалять дубликаты.
  • Ограничивать количество элементов в потоке.

Примеры промежуточных операций

  1. filter(Predicate<? super T> predicate): Оставляет только те элементы, которые соответствуют заданному условию.

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
    Stream<String> filteredStream = names.stream().filter(name -> name.startsWith("A"));
    // Оставляет только "Alice"
    
    • names.stream(): Создает поток из списка имен.
    • filter(name -> name.startsWith("A")): Применяет условие, оставляя только имена, начинающиеся с "A".
  2. map(Function<? super T, ? extends R> mapper): Преобразует каждый элемент потока.

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
    Stream<Integer> lengthStream = names.stream().map(String::length);
    // Преобразует имена в их длины: 5, 3, 7
    
    • map(String::length): Преобразует каждое имя в его длину.
  3. sorted(): Упорядочивает элементы потока в естественном порядке.

    List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
    Stream<Integer> sortedStream = numbers.stream().sorted();
    // Упорядочивает числа: 1, 1, 3, 4, 5, 9
    
    • sorted(): Упорядочивает элементы в естественном порядке.
  4. distinct(): Удаляет дубликаты из потока.

    List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
    Stream<Integer> distinctStream = numbers.stream().distinct();
    // Удаляет дубликаты: 1, 2, 3, 4, 5
    
    • distinct(): Удаляет повторяющиеся элементы.
  5. limit(long maxSize): Ограничивает количество элементов в потоке.

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
    Stream<String> limitedStream = names.stream().limit(2);
    // Ограничивает поток до первых двух элементов: "Alice", "Bob"
    
    • limit(2): Ограничивает поток до двух элементов.
  6. skip(long n): Пропускает первые n элементов потока.

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
    Stream<String> skippedStream = names.stream().skip(2);
    // Пропускает первые два элемента: "Charlie", "David"
    
    • skip(2): Пропускает первые два элемента.

Как работают промежуточные операции?

Промежуточные операции ленивы, то есть они не выполняются до тех пор, пока не будет вызвана терминальная операция, такая как collect(), forEach(), reduce() и другие. Это позволяет оптимизировать выполнение, так как операции могут быть объединены и выполнены за один проход по данным.

Тема: Java
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки