Что такое Stream?

1. Что такое Stream API?
Stream API — ключевой компонент Java начиная с версии 8, позволяющий легко и гибко обрабатывать коллекции данных функциональным способом. Stream — это последовательность элементов, поддерживающая последовательные и параллельные операции обработки данных.
2. Преимущества использования Stream API
- Минимизация объема шаблонного кода.
- Улучшение читаемости и лаконичности программ, особенно при работе с коллекциями.
- Встроенная поддержка параллельной обработки (parallel streams).
- Широкий набор методов для фильтрации, сортировки, преобразования и сбора данных.
3. Основные характеристики потоков
- Легкая интеграция с лямбда выражениями. Stream API создан с учетом функциональных операций.
- Потоки не хранят данные. Они лишь перемещают, фильтруют или трансформируют переданные им элементы.
- Потоки неизменяемы (immutable). Они не изменяют состояние коллекции, с которой работают.
- Потоки нельзя использовать повторно. После обработки поток исчерпан.
- Потоки не поддерживают доступ к элементу по индексу.
- Lazy-операции. Операции выполняются только при необходимости (отложено).
4. Интерфейсы для работы с потоками
Stream API состоит из следующих ключевых интерфейсов:
- java.util.stream.Stream<T> - для объектов.
- DoubleStream, IntStream, LongStream - для примитивных типов.
5. Создание потоков
Stream можно создать разными способами:
1. Из коллекции:
List<String> words = Arrays.asList("hello", "hola", "hallo", "ciao");
Stream<String> stream = words.stream();
2. С помощью Stream.of:
Stream<String> stream = Stream.of("hello","hola", "hallo", "ciao");
3. Из массива:
String[] words = {"hello", "hola", "hallo", "ciao"};
Stream<String> stream = Stream.of(words);
4. Для примитивов:
nt[] nums = {1, 2, 3, 4, 5};
System.out.println(Arrays.stream(nums).count());
int[] nums = {1, 2, 3, 4, 5};
System.out.println(IntStream.of(nums).count());
5. С помощью генератора и итератора:
Stream<Double> s = Stream.generate(Math::random).limit(5);
Stream<Integer> s = Stream.iterate(1, n -> n * 2).limit(5);
6. Использование билдера:
Stream<String> s = Stream.<String>builder().add("h").add("e").add("l").add("l").add("o").build();
s.forEach(System.out::print); // "hello"
7. Диапазоны:
// stream of 1, 2, 3
IntStream s = IntStream.range(1, 4);
// stream of 1, 2, 3, 4
IntStream s = IntStream.rangeClosed(1, 4);
6. Примеры обработки коллекций с помощью Stream API
Пример до Stream API:
List<Student> studentsScore = new ArrayList<>();
for(Student s : students) {
if(s.getScore() > 90.0) {
studentsScore.add(s);
}
}
Collections.sort(studentsScore, new Comparator<>() {
public int compare(Student s1, Student s2) {
return Double.compare(
s1.getScore(), s2.getScore());
}
});
Перепишем предыдущий пример с использованием Stream API:
List<Student> studentsScore = students
.stream()
.filter(s -> s.getScore() >= 90.0)
.sorted(Comparator.comparing(Student::getScore))
.collect(Collectors.toList());
Поток данных - канал передачи данных. Поток данных представляет собой последовательность объектов. Поток данных оперирует источником данных, например массивом или коллекцией. В потоковом API определяется ряд потоковых интерфейсов, входящих в состав пакета java.util.stream.

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.