← Назад ко всем вопросам

Чем Stream отличается от Collection? Можно ли переиспользовать Stream?

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

В Java Stream и Collection — это два разных подхода к работе с данными, и они имеют свои особенности и области применения.

Collection:

  • Collection — это интерфейс, который представляет собой группу объектов, известных как элементы. Он является частью Java Collections Framework и включает такие структуры данных, как List, Set, Queue и Map.
  • Основная задача Collection — хранение и управление данными в памяти. Это позволяет добавлять, удалять и изменять элементы.
  • Collection поддерживает итерацию через элементы с помощью циклов или итераторов.

Пример использования Collection:

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
​
for (String fruit : list) {
    System.out.println(fruit);
}

В этом примере создается список list, в который добавляются элементы, и затем они выводятся на экран.

Stream:

  • Stream — это последовательность данных, которая позволяет выполнять различные операции над элементами, такие как фильтрация, сортировка, отображение и агрегация.
  • Stream не хранит данные. Он обрабатывает данные на лету, что позволяет эффективно работать с большими объемами данных.
  • Stream поддерживает ленивые вычисления, что означает, что операции выполняются только тогда, когда это необходимо.
  • Stream нельзя переиспользовать. После выполнения терминальной операции, такой как collect(), forEach(), reduce(), поток закрывается и становится недоступным для дальнейшего использования.

Пример использования Stream:

List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
​
list.stream()
    .filter(fruit -> fruit.startsWith("A"))
    .forEach(System.out::println);

В этом примере создается поток из списка list, фильтруются элементы, начинающиеся с буквы "A", и затем они выводятся на экран. После выполнения forEach() поток закрывается и не может быть использован повторно.

Переиспользование Stream:

  • Stream нельзя переиспользовать. После выполнения терминальной операции поток закрывается. Если необходимо повторно обработать данные, нужно создать новый поток из исходной коллекции или источника данных.

Пример попытки переиспользования Stream:

Stream<String> stream = list.stream();
stream.forEach(System.out::println); // Поток используется здесь
​
// Следующая строка вызовет IllegalStateException, так как поток уже использован
stream.forEach(System.out::println);

В этом примере попытка повторного использования stream после выполнения forEach() приведет к выбросу исключения IllegalStateException. Чтобы избежать этого, необходимо создать новый поток из исходной коллекции.

Тема: Java
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки