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 .