Перейти к основному содержимому

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

· 2 мин. чтения

1. Введение

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

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

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

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

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

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

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

3. Использование плоской карты ()

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

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

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

List<String> 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 :

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

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

5. Вывод

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

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