ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Проверка пустоты Stream в Java 8 без материализации

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы определить, является ли поток данных Stream пустым, используйте метод findFirst() вместе с методом Optional.isEmpty():

Java
Скопировать код
boolean isEmpty = stream.findFirst().isEmpty();

Метод isEmpty(), введенный в Optional начиная с Java 11, сделал код более интуитивно понятным и лаконичным. Если вы работаете на платформе Java 8 и не можете использовать isEmpty(), тогда пользуйтесь следующим вариантом:

Java
Скопировать код
boolean isEmpty = !stream.findAny().isPresent();

Такой способ позволяет проверить Stream на наличие в нем элементов, не проходя через все эти элементы, что обеспечивает экономию ресурсов при обработке обширных данных.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Приемы эффективной проверки на пустоту

При работе с большими объемами данных критически важно обеспечивать оптимальную производительность. Вот несколько способов быстро проверить Stream на пустоту:

Комбинация findAny() и isPresent()

Java
Скопировать код
boolean isEmpty = !stream.findAny().isPresent();

Этот код позволяет предотвратить полный обход всех элементов потока, если достаточно узнать о наличии хотя бы одного элемента.

Использование Spliterator

Java
Скопировать код
Spliterator<T> spliterator = stream.spliterator();
boolean isEmpty = !spliterator.tryAdvance(e -> {});

Используя этот прием, вы можете "заглянуть" в поток с помощью Spliterator без израсходования элементов и оценить его пустоту на промежуточном этапе обработки.

Обработка исключений

Java
Скопировать код
stream.findAny().ifPresent(s -> {
    throw new RuntimeException("Stream is not empty!");
});

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

Преобразование Iterator в Stream

Java
Скопировать код
Iterator<T> iterator = stream.iterator();
Stream<T> streamFromIterator = StreamSupport.stream(spliterator, stream.isParallel());
boolean isEmpty = !iterator.hasNext();

Этот метод проверки на пустоту помогает установить заполненность потока, не вмешиваясь в его элементы.

Визуализация

Для лучшего понимания, представим поток (Stream) как дверь с сенсорами в библиотеке нового поколения:

Markdown
Скопировать код
Дверь: | 🚪 |
Статус двери: | ❔ |

Пропустим поток через эту дверь:

Java
Скопировать код
boolean isEmpty = stream.noneMatch(x -> true);

Если в потоке нет элементов, то дверь будет показывать:

Markdown
Скопировать код
Статус двери : | 💡 (Комната свободна!) |

Если в потоке имеется хотя бы один элемент:

Markdown
Скопировать код
Статус двери : | 🔈 (Занято!) |

Метод noneMatch() работает как сенсор, определяющий занятую ли рассматриваемую комнату, а именно наличие элементов в потоке.

Расширенные паттерны проверки на пустоту

Углубите свои знания при помощи дополнительных примеров с практическими примерами и небольшой долей юмора:

Комбинация map и orElse

Java
Скопировать код
boolean isEmpty = stream.map(e -> true).findAny().orElse(false);

Это можно сравнить с игрой в угадайку: если выигрыша нет, то orElse подтвердит это, вернув false.

Работа с параллельными потоками

Java
Скопировать код
boolean isEmpty = stream.parallel().noneMatch(x -> true);

Тут мы подходим со всех сторон, спрашивая у всех параллельных потоков сразу: если все они "пустые", значит, таков и основной поток.

Исключение при наличии элементов в не терминальных операциях

Java
Скопировать код
stream.peek(e -> { throw new IllegalStateException("Stream is not empty!"); }).collect(Collectors.toList());

Когда поток не должен содержать элементы, но обнаруживается хотя бы один, выбрасывается исключение.

Полезные материалы

  1. Stream (Java Platform SE 8) – Подробно ознакомьтесь с официальной документацией Stream API на Java 8.
  2. Java 8 – Streams – Проведите глубокое изучение потоковых операций в Java 8.
  3. Stream in Java – GeeksforGeeks – Подробнее узнайте о Java Streams.
  4. Discussions on Stack Overflow about checking if a stream is empty – Посмотрите на разнообразие точек зрения сообщества разработчиков на данную тему.
  5. DZone: Java 8 Stream API – Усвойте нюансы Stream API в Java по мере прохождения данного практического руководства.