Stream API, представленный в Java 8, используется для обработки коллекций объектов. Поток в Java — это последовательность объектов, поддерживающая различные методы, которые можно конвейеризировать для получения желаемого результата.
Использование потока в Java
Ниже упомянуто использование Stream в Java:
- Stream API — это способ выражения и обработки коллекций объектов.
- Позвольте нам выполнять такие операции, как фильтрация, сопоставление, сокращение и сортировка.
Как создать Java Stream?
Создание Java Stream — это один из самых основных шагов перед рассмотрением функциональных возможностей Java Stream. Ниже приведен синтаксис объявления Java Stream.
Синтаксис
Stream<T> stream;
Здесь T — это класс, объект или тип данных в зависимости от объявления.
Возможности Java-стрима
Особенности потока Java упомянуты ниже:
- Поток не является структурой данных, а принимает входные данные из коллекций, массивов или каналов ввода-вывода.
- Потоки не меняют исходную структуру данных, они только предоставляют результат в соответствии с конвейерными методами.
- Каждая промежуточная операция выполняется лениво и в результате возвращает поток, поэтому различные промежуточные операции могут быть конвейеризированы. Терминальные операции отмечают конец потока и возвращают результат.
Различные операции над потоками
В потоках есть два типа операций:
- Промежуточные операции
- Завершить операции
Промежуточные операции
Промежуточные операции — это типы операций, в которых несколько методов объединены в одну цепочку.
Характеристики промежуточных операций
- Методы связаны друг с другом.
- Промежуточные операции преобразуют один поток в другой поток.
- Это обеспечивает концепцию фильтрации, при которой один метод фильтрует данные и передает их другому методу после обработки.
Важные промежуточные операции
Ниже приведены несколько промежуточных операций:
1. map()
Метод карты используется для возврата потока, состоящего из результатов применения заданной функции к элементам этого потока.
List number = Arrays.asList(2,3,4,5); List square = number.stream().map(x->x*x).collect(Collectors.toList());
2. filter()
Метод фильтра используется для выбора элементов в соответствии с предикатом, переданным в качестве аргумента.
List names = Arrays.asList("Reflection","Collection","Stream"); List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList());
3. sorted()
Метод sorted используется для сортировки потока.
List names = Arrays.asList("Reflection","Collection","Stream"); List result = names.stream().sorted().collect(Collectors.toList());
Терминальные операции
Терминальные операции — это тип операций, которые возвращают результат. Эти операции не обрабатываются дальше, а просто возвращают окончательное значение результата.
Важные операции с терминалом
Ниже приведены несколько терминальных операций:
1. collect()
Метод сбора используется для возврата результата промежуточных операций, выполненных над потоком.
List number = Arrays.asList(2,3,4,5,3); Set square = number.stream().map(x->x*x).collect(Collectors.toSet());
2. forEach()
Метод forEach используется для перебора каждого элемента потока.
List number = Arrays.asList(2,3,4,5); number.stream().map(x->x*x).forEach(y->System.out.println(y));
3. reduce()
Метод уменьшения используется для сведения элементов потока к одному значению. Метод сокращения принимает BinaryOperator в качестве параметра.
List number = Arrays.asList(2,3,4,5); int even = number.stream().filter(x->x%2==0).reduce(0,(ans,i)-> ans+i);
Здесь переменной ans присваивается 0 в качестве начального значения и к ней добавляется i.
Примечание. Промежуточные операции выполняются на основе концепции ленивой оценки, которая гарантирует, что каждый метод возвращает фиксированное значение (терминальная операция) перед переходом к следующему методу.
Пример Java Stream
Java
// Java program to demonstrate
// the use of stream in java
import
java.util.*;
import
java.util.stream.*;
class
Demo {
public
static
void
main(String args[])
{
// create a list of integers
List<Integer> number = Arrays.asList(
2
,
3
,
4
,
5
);
// demonstration of map method
List<Integer> square
= number.stream()
.map(x -> x * x)
.collect(Collectors.toList());
// create a list of String
List<String> names = Arrays.asList(
"Reflection"
,
"Collection"
,
"Stream"
);
// demonstration of filter method
List<String> result
= names.stream()
.filter(s -> s.startsWith(
"S"
))
.collect(Collectors.toList());
System.out.println(result);
// demonstration of sorted method
List<String> show
= names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(show);
// create a list of integers
List<Integer> numbers
= Arrays.asList(
2
,
3
,
4
,
5
,
2
);
// collect method returns a set
Set<Integer> squareSet
= numbers.stream()
.map(x -> x * x)
.collect(Collectors.toSet());
System.out.println(squareSet);
// demonstration of forEach method
number.stream()
.map(x -> x * x)
.forEach(y -> System.out.println(y));
// demonstration of reduce method
int
even
= number.stream()
.filter(x -> x %
2
==
0
)
.reduce(
0
, (ans, i) -> ans + i);
System.out.println(even);
}
}
Выход
[4, 9, 16, 25] [Stream] [Collection, Reflection, Stream] [16, 4, 9, 25] 4 9 16 25 6
Важные моменты/наблюдения за Java Stream
- Поток состоит из источника, за которым следуют ноль или более промежуточных методов, объединенных вместе (конвейерно), и терминального метода для обработки объектов, полученных из источника, в соответствии с описанными методами.
- Stream используется для вычисления элементов согласно конвейерным методам без изменения исходного значения объекта.