Рубрики
Без рубрики

Фильтрация потока необязательных в Java

Краткое и практическое руководство по фильтрации необязательных потоков в Java 8 и Java 9

Автор оригинала: baeldung.

1. введение

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

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

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

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

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

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

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

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

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

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

В качестве альтернативы вы можете применить тот же подход, используя другой способ преобразования Необязательного в Поток :

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

4. Необязательные функции Java 9::поток

Все это значительно упростится с появлением Java 9, которая добавляет метод stream() в Необязательно .

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

Он вернет поток из одного или нулевого элемента(ов), независимо от того, присутствует или нет Необязательное значение:

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

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

Благодаря этому мы быстро увидели три способа фильтрации текущих значений из потока из Необязательно .

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