Фильтрация потока опций в Java

Фильтрация потока опций в Java

1. Вступление

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

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

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

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

2. Используяfilter()

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

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

3. ИспользуяflatMap()

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

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

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

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

4. Необязательный :: stream в Java 9

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

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

Он вернет поток из одного или нуля элементов, независимо от того, присутствует ли значениеOptional или нет:

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

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

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

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