Что такое Stream?

Что такое Stream? фото
Author: Tatyana Milkina

1. Что такое Stream API?

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

2. Преимущества использования Stream API

  • Минимизация объема шаблонного кода.
  • Улучшение читаемости и лаконичности программ, особенно при работе с коллекциями.
  • Встроенная поддержка параллельной обработки (parallel streams).
  • Широкий набор методов для фильтрации, сортировки, преобразования и сбора данных.

3. Основные характеристики потоков

  1. Легкая интеграция с лямбда выражениями. Stream API создан с учетом функциональных операций.
  2. Потоки не хранят данные. Они лишь перемещают, фильтруют или трансформируют переданные им элементы.
  3. Потоки неизменяемы (immutable). Они не изменяют состояние коллекции, с которой работают.
  4. Потоки нельзя использовать повторно. После обработки поток исчерпан.
  5. Потоки не поддерживают доступ к элементу по индексу.
  6. 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.

Курс 'Java для начинающих' на Udemy Курс 'Java для начинающих' на Udemy
Читайте также:
Комментарии