Проверка пустоты Stream в Java 8 без материализации
Быстрый ответ
Чтобы определить, является ли поток данных Stream пустым, используйте метод findFirst() вместе с методом Optional.isEmpty():
boolean isEmpty = stream.findFirst().isEmpty();
Метод isEmpty(), введенный в Optional начиная с Java 11, сделал код более интуитивно понятным и лаконичным. Если вы работаете на платформе Java 8 и не можете использовать isEmpty(), тогда пользуйтесь следующим вариантом:
boolean isEmpty = !stream.findAny().isPresent();
Такой способ позволяет проверить Stream на наличие в нем элементов, не проходя через все эти элементы, что обеспечивает экономию ресурсов при обработке обширных данных.

Приемы эффективной проверки на пустоту
При работе с большими объемами данных критически важно обеспечивать оптимальную производительность. Вот несколько способов быстро проверить Stream на пустоту:
Комбинация findAny() и isPresent()
boolean isEmpty = !stream.findAny().isPresent();
Этот код позволяет предотвратить полный обход всех элементов потока, если достаточно узнать о наличии хотя бы одного элемента.
Использование Spliterator
Spliterator<T> spliterator = stream.spliterator();
boolean isEmpty = !spliterator.tryAdvance(e -> {});
Используя этот прием, вы можете "заглянуть" в поток с помощью Spliterator без израсходования элементов и оценить его пустоту на промежуточном этапе обработки.
Обработка исключений
stream.findAny().ifPresent(s -> {
    throw new RuntimeException("Stream is not empty!");
});
Такой подход изящно функционирует в ситуациях, когда Stream обязательно должен быть пустым. Если в нем обнаруживается хотя бы один элемент, выбрасывается исключение.
Преобразование Iterator в Stream
Iterator<T> iterator = stream.iterator();
Stream<T> streamFromIterator = StreamSupport.stream(spliterator, stream.isParallel());
boolean isEmpty = !iterator.hasNext();
Этот метод проверки на пустоту помогает установить заполненность потока, не вмешиваясь в его элементы.
Визуализация
Для лучшего понимания, представим поток (Stream) как дверь с сенсорами в библиотеке нового поколения:
Дверь: | 🚪 |
Статус двери: | ❔ |
Пропустим поток через эту дверь:
boolean isEmpty = stream.noneMatch(x -> true);
Если в потоке нет элементов, то дверь будет показывать:
Статус двери : | 💡 (Комната свободна!) |
Если в потоке имеется хотя бы один элемент:
Статус двери : | 🔈 (Занято!) |
Метод noneMatch() работает как сенсор, определяющий занятую ли рассматриваемую комнату, а именно наличие элементов в потоке.
Расширенные паттерны проверки на пустоту
Углубите свои знания при помощи дополнительных примеров с практическими примерами и небольшой долей юмора:
Комбинация map и orElse
boolean isEmpty = stream.map(e -> true).findAny().orElse(false);
Это можно сравнить с игрой в угадайку: если выигрыша нет, то orElse подтвердит это, вернув false.
Работа с параллельными потоками
boolean isEmpty = stream.parallel().noneMatch(x -> true);
Тут мы подходим со всех сторон, спрашивая у всех параллельных потоков сразу: если все они "пустые", значит, таков и основной поток.
Исключение при наличии элементов в не терминальных операциях
stream.peek(e -> { throw new IllegalStateException("Stream is not empty!"); }).collect(Collectors.toList());
Когда поток не должен содержать элементы, но обнаруживается хотя бы один, выбрасывается исключение.
Полезные материалы
- Stream (Java Platform SE 8) – Подробно ознакомьтесь с официальной документацией Stream API на Java 8.
 - Java 8 – Streams – Проведите глубокое изучение потоковых операций в Java 8.
 - Stream in Java – GeeksforGeeks – Подробнее узнайте о Java Streams.
 - Discussions on Stack Overflow about checking if a stream is empty – Посмотрите на разнообразие точек зрения сообщества разработчиков на данную тему.
 - DZone: Java 8 Stream API – Усвойте нюансы Stream API в Java по мере прохождения данного практического руководства.
 


