Чем 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. Чтобы избежать этого, необходимо создать новый поток из исходной коллекции.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться