«1. Введение

В этой статье мы поговорим о том, как отфильтровать непустые значения из потока опционов.

Мы рассмотрим три разных подхода — два с использованием Java 8 и один с новой поддержкой в ​​Java 9.

Мы будем работать с одним и тем же списком во всех примерах:

List<Optional<String>> listOfOptionals = Arrays.asList(
  Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));

2. Использование filter()

Один из вариантов в Java 8 — отфильтровать значения с помощью Optional::isPresent, а затем выполнить сопоставление с помощью функции Optional::get для извлечения значений:

List<String> filteredList = listOfOptionals.stream()
  .filter(Optional::isPresent)
  .map(Optional::get)
  .collect(Collectors.toList());

3. Использование flatMap()

Другим вариантом может быть использование flatMap с лямбда-выражением, которое преобразует пустой необязательный параметр в пустой экземпляр Stream, а непустой необязательный элемент — в экземпляр Stream, содержащий только один элемент:

List<String> filteredList = listOfOptionals.stream()
  .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
  .collect(Collectors.toList());

В качестве альтернативы вы можете применить тот же подход, используя другой способ преобразования Optional в Stream: метод stream() на необязательный.

List<String> filteredList = listOfOptionals.stream()
  .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
  .collect(Collectors.toList());

Этот подход похож на тот, что показан в разделе 3, но на этот раз мы используем предопределенный метод для преобразования экземпляра Optional в экземпляр Stream: Необязательное значение присутствует или отсутствует:

5. Заключение

Таким образом, мы быстро рассмотрели три способа фильтрации текущих значений из Потока Необязательных.

Полную реализацию примеров кода можно найти в проекте Github.

List<String> filteredList = listOfOptionals.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());

«

With this, we’ve quickly seen three ways of filtering the present values out of a Stream of Optionals.

The full implementation of code samples can be found on the Github project.