что такое Stream в Java ?

`Stream` — это абстракция, которая позволяет обрабатывать последовательности элементов (например, коллекции) в функциональном стиле. API был добавлен в Java 8 и представляет собой набор классов и интерфейсов в пакете `java.util.stream`. Основная цель — упростить работу с коллекциями данных, позволяя выполнять различные операции с элементами последовательности, такие как фильтрация, сортировка, преобразование, агрегирование и другие, без необходимости явно писать циклы и управлять итерациями.

Особенности:

1. Не изменяет исходные данные: Операции с потоками данных не модифицируют исходную коллекцию, что способствует функциональному подходу и неизменяемости данных.
2. Ленивая обработка: Большинство операций с потоками выполняются лениво, то есть вычисления начинаются только тогда, когда это необходимо для получения результата (например, при вызове терминальной операции).
3. Поддержка параллельной обработки: Позволяет легко выполнять операции над элементами коллекции параллельно, что может значительно ускорить обработку больших наборов данных на многопроцессорных системах.

Основные операции:

Операции с потоками данных делятся на промежуточные (intermediate) и терминальные (terminal).

  • Промежуточные операции возвращают новый поток и включают фильтрацию (`filter`), преобразование (`map`), сортировку (`sorted`) и другие. Они используются для преобразования потока и могут быть объединены в цепочки.
  • Терминальные операции возвращают результат определенного типа (например, коллекцию, значение, boolean) или выполняют действие (`forEach`). К терминальным операциям относятся `collect`, `reduce`, `count`, `findFirst`.

Пример использования:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("apple", "banana", "cherry", "date");

        // Фильтрация и преобразование списка строк в список их длин
        List<Integer> lengths = strings.stream() // Создание потока
                .filter(s -> s.length() > 5) // Фильтрация строк по длине
                .map(String::length) // Преобразование строки в её длину
                .collect(Collectors.toList()); // Сбор результатов в список

        System.out.println(lengths); // Вывод: [6, 6]
    }
}

`Stream` API обеспечивает мощный и гибкий инструментарий для работы с данными в декларативном стиле, позволяя сосредоточиться на операциях обработки данных, а не на управлении итерациями и хранением промежуточных результатов.

Feb. 22, 2024, easyoffer

Интерфейс java.util.Stream представляет собой последовательность элементов, над которой можно производить различные операции.

Операции над стримами бывают или промежуточными (intermediate) или конечными (terminal). Конечные операции возвращают результат определенного типа, а промежуточные операции возвращают тот же стрим. Таким образом вы можете строить цепочки из несколько операций над одним и тем же стримом.

У стрима может быть сколько угодно вызовов промежуточных операций и последним вызов конечной операции. При этом все промежуточные операции выполняются лениво и пока не будет вызвана конечная операция, никаких действий на самом деле не происходит (похоже на создание объекта Thread или Runnable, без вызова start()).

Стримы создаются на основе каких-либо источников, например классов из java.util.Collection.

Ассоциативные массивы (maps), например, HashMap, не поддерживаются.

Операции над стримами могут выполняться как последовательно, так и параллельно.

Потоки не могут быть использованы повторно. Как только была вызвана какая-нибудь конечная операция, поток закрывается.

Кроме универсальных объектных существуют особые виды стримов для работы с примитивными типами данных intlong и doubleIntStreamLongStream и DoubleStream. Эти примитивные стримы работают так же, как и обычные объектные, но со следующими отличиями:

  • используют специализированные лямбда-выражения, например, IntFunction или IntPredicate вместо Function и Predicate;
  • поддерживают дополнительные конечные операции sum()average()mapToObj().

Oct. 21, 2023, Источник