> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-java/stream-api.md).

# Stream API

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

Основные преимущества Stream API:

1. **Удобство и краткость кода**: Stream API позволяет писать компактный и выразительный код, используя цепочку операций над данными.
2. **Ленивая вычислительная модель**: Многие операции Stream API выполняются лениво, что означает, что они вычисляются только при необходимости. Это повышает производительность и экономит ресурсы.
3. **Параллельная обработка данных**: Stream API поддерживает параллельную обработку данных, что позволяет использовать все ядра процессора для ускорения выполнения операций.
4. **Интеграция с лямбда-выражениями**: Stream API хорошо интегрируется с лямбда-выражениями, что позволяет писать гибкий и функциональный код.

Примеры операций Stream API:

```java
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eva");

        // Фильтрация и сортировка имен, начинающихся с буквы "A", в верхнем регистре
        names.stream()
            .filter(name -> name.startsWith("A"))
            .map(String::toUpperCase)
            .sorted()
            .forEach(System.out::println);

        // Вычисление суммы квадратов чисел
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        int sumOfSquares = numbers.stream()
                                 .mapToInt(x -> x * x)
                                 .sum();
        System.out.println("Сумма квадратов чисел: " + sumOfSquares);
    }
}
```

В этом примере мы создаем поток данных из списка имен `names`, фильтруем имена, начинающиеся с буквы "A", преобразуем их в верхний регистр, сортируем и выводим на экран. Затем мы используем метод `sum()` для вычисления суммы квадратов чисел из списка `numbers`.

1. **filter**: Фильтрует элементы потока с помощью предиката (функции, возвращающей булево значение).

   ```java
   stream.filter(predicate)
   ```
2. **map**: Преобразует каждый элемент потока с помощью переданной функции.

   ```java
   stream.map(mapper)
   ```
3. **flatMap**: Преобразует каждый элемент потока в поток других элементов и объединяет их в один поток.

   ```java
   stream.flatMap(mapper)
   ```
4. **distinct**: Удаляет дубликаты из потока.

   ```java
   stream.distinct()
   ```
5. **sorted**: Сортирует элементы потока в заданном порядке.

   ```java
   stream.sorted()
   ```
6. **limit**: Ограничивает количество элементов в потоке.

   ```java
   stream.limit(n)
   ```
7. **skip**: Пропускает первые n элементов в потоке.

   ```java
   stream.skip(n)
   ```
8. **forEach**: Применяет действие к каждому элементу потока.

   ```java
   stream.forEach(action)
   ```
9. **reduce**: Объединяет элементы потока в одно значение.

   ```java
   stream.reduce(identity, accumulator)
   ```
10. **collect**: Собирает элементы потока в коллекцию или другую структуру данных.

    ```java
    stream.collect(collector)
    ```
11. **anyMatch**: Проверяет, удовлетворяет ли хотя бы один элемент потока условию.

    ```java
    stream.anyMatch(predicate)
    ```
12. **allMatch**: Проверяет, удовлетворяют ли все элементы потока условию.

    ```java
    stream.allMatch(predicate)
    ```
13. **noneMatch**: Проверяет, не удовлетворяет ли ни один элемент потока условию.

    ```java
    stream.noneMatch(predicate)
    ```
14. **findFirst**: Возвращает первый элемент потока.

    ```java
    stream.findFirst()
    ```
15. **findAny**: Возвращает любой элемент потока.

    ```java
    stream.findAny()
    ```
