Stream API был представлен в Java 8. Он используется для обработки коллекций объектов. С помощью функций Streams и Lambda мы можем писать чистый, лаконичный и понятный код.

Streams - это конвейер операций, который мы можем использовать для оценки данных.

Потоки имеют промежуточные и конечные операции, которые мы можем использовать по нашему требованию. Вот список операций:

Промежуточные операции: просмотр, плоская карта, ограничение, сортировка, отдельные, карта, фильтр и т. д.

Терминал Операции: noneMatch, allMatch, collect, findAny, findFirst, anyMatch, toArray, reduce, min, max, forEach, collect, count и т. д.

Как создать объект Stream?

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Stream<Integer> numberStream = numbers.stream();
Stream<Integer> newNumberStream = Stream.of(1,2,3,4,5,6,7,8,9,10);

Оба упомянутых выше способа предоставляют нам объект потока. Либо мы вызываем метод stream () над объектом коллекции, либо передаем значения непосредственно методу Stream.of ().

Давайте посмотрим, как работают промежуточные методы в потоках:

  1. Карта:

Метод map () используется для выполнения операции над списком коллекции. Давайте посмотрим, как мы можем создать список кубиков из числа, указанного в данном списке.

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

List<Integer> cubedNumbers= numbers.stream()
        .map(x -> x*x*x).collect(Collectors.toList());

System.out.print(cubedNumbers);

Результат, который мы видим здесь:

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

2. Фильтр:

Метод filter (), используемый для фильтрации результатов в соответствии с нашими условиями. Теперь давайте рассмотрим, что мы хотим отфильтровать четные числа из списка чисел от 1 до 10.

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

List<Integer> evenNumbers = numbers.stream()
        .filter(x -> x%2==0).collect(Collectors.toList());


 System.out.print(evenNumbers);

Результатом будет:

[2, 4, 6, 8, 10]

3. Сортировать:

Теперь, если вы желаете отсортировать данную коллекцию, Стримы к вашим услугам !! Вы можете использовать метод sorted () в качестве промежуточной функции для сортировки.

List<Integer> numbers = Arrays.asList(6,7,8,1,4,5,9,10,2,3);
List<Integer> sortedList = numbers.stream().sorted().collect(Collectors.toList());

System.out.print(sortedList);

Результат здесь будет:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

4. FlatMap:

FlatMap () используется для преобразования 2 уровней потока в 1 уровень потока. Проще говоря, если у нас есть коллекция arrayList, состоящая из arrayList, то с помощью flatMap () мы можем преобразовать их в один ArrayList.

List<Integer> list1 = Arrays.asList(1,2,3);
List<Integer> list2 = Arrays.asList(4,5,6);
List<Integer> list3 = Arrays.asList(7,8,9);

List<List<Integer>> listOfNumbers = Arrays.asList(list1, list2, list3);

List<Integer> listOfAllIntegers = listOfNumbers.stream()
        .flatMap(x -> x.stream())
        .collect(Collectors.toList());

System.out.println(listOfAllIntegers);

Результат будет таким:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

5. Отличный:

Если в данной коллекции есть повторяющиеся элементы, мы можем использовать метод отличного (), чтобы удалить повторяющиеся элементы и получить отфильтрованную коллекцию.

List<String> countries = Arrays.asList("India", "Australia", "SriLanka","Russia", "Australia","SriLanka","India");

List<String> distinctCountries = countries.stream().distinct()
.collect(Collectors.toList());
    System.out.println(distinctCountries);
}

Результатом здесь будет:

[India, Australia, SriLanka, Russia]

6. Заглянуть:

peek () - это промежуточное действие. peek () возвращает поток, состоящий из элементов пройденного потока, дополнительно выполняя предусмотренное действие над каждым элементом по мере того, как элементы потребляются из результирующего потока.

peek () ничего не сделает, если мы не укажем терминальную операцию.

Stream.of(1,2,3,4,5,6,7,8,9,0)
        .filter(x -> x%2 ==0)
        .peek(e -> System.out.println("The even numbers 
         are : " + e))
        .collect(Collectors.toList());

Это обеспечивает вывод:

The even numbers are : 2
The even numbers are : 4
The even numbers are : 6
The even numbers are : 8
The even numbers are : 0

Теперь давайте посмотрим на операции терминала:

  1. Сбор:

Операция collect () помогает собрать поток в коллекцию. Этот метод использует реализацию Collector, которая обеспечивает полезные операции сокращения.

List listOfCountries = Arrays.asList("India", "Indonesia", "Nepal", "Afghanistan");

List output = (List) listOfCountries.stream()
        .filter(x-> x.toString().startsWith("I"))
        .collect(Collectors.toList());
System.out.println(output);

Выход :

[India, Indonesia]

2. Подсчет:

Операция терминала count () помогает нам найти количество обработанной коллекции.

List listOfCountries = Arrays.asList("India", "Indonesia", "Nepal", "Afghanistan");

long output = listOfCountries.stream()
        .filter(x-> x.toString().startsWith("I"))
        .count();

System.out.println(output);

Выход :

2

3. AllMatch:

Операция allMatch () помогает нам получить ответ: Все ли элементы потока соответствуют условию?

List listOfCountries = Arrays.asList("India", "Indonesia", "Nepal", "Afghanistan");

boolean areAllElementsStartingWithI = listOfCountries.stream()
        .allMatch(x -> x.toString().startsWith("I"));

System.out.println(areAllElementsStartingWithI);

Выход:

false

4. AnyMatch:

По сравнению с allMatch () anyMatch () помогает проверить, соответствует ли какой-либо из элементов в потоке условию.

List listOfCountries = Arrays.asList("India", "Indonesia", "Nepal", "Afghanistan");

boolean areAllElementsStartingWithI = listOfCountries.stream()
        .anyMatch(x -> x.toString().startsWith("I"));

System.out.println(areAllElementsStartingWithI);

Выход:

true

5. ForEach:

Метод forEach () используется для перебора результирующей коллекции, как и в традиционном цикле for.

List listOfCountries = Arrays.asList("India", "Indonesia", "Nepal", "Afghanistan");

listOfCountries.stream()
         .filter(x-> x.toString().startsWith("I"))
         .forEach(System.out::println);

Выход:

India
Indonesia

Это было !! Получайте удовольствие и впредь пользуйтесь стримами очень часто!