1. введение
В этой статье мы поговорим о том, как отфильтровать непустые значения из потока из Необязательно .
Мы рассмотрим три различных подхода – два с использованием Java 8 и один с использованием новой поддержки в Java 9.
Мы будем работать над одним и тем же списком во всех примерах:
List> listOfOptionals = Arrays.asList( Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2. Использование фильтра()
Один из вариантов в Java 8-отфильтровать значения с помощью Необязательно::Присутствует , а затем выполнить сопоставление с помощью функции Необязательно::get для извлечения значений:
ListfilteredList = listOfOptionals.stream() .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList());
3. Использование flatMap()
Другим вариантом было бы использовать flatMap с лямбда-выражением, которое преобразует пустой Необязательный в пустой Поток экземпляр, а непустой Необязательный в Поток экземпляр, содержащий только один элемент:
ListfilteredList = listOfOptionals.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList());
В качестве альтернативы вы можете применить тот же подход, используя другой способ преобразования Необязательного в Поток :
ListfilteredList = listOfOptionals.stream() .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty)) .collect(Collectors.toList());
4. Необязательные функции Java 9::поток
Все это значительно упростится с появлением Java 9, которая добавляет метод stream() в Необязательно .
Этот подход аналогичен подходу, показанному в разделе 3, но на этот раз мы используем предопределенный метод для преобразования Необязательного экземпляра в Поток экземпляр:
Он вернет поток из одного или нулевого элемента(ов), независимо от того, присутствует или нет Необязательное значение:
ListfilteredList = listOfOptionals.stream() .flatMap(Optional::stream) .collect(Collectors.toList());
5. Заключение
Благодаря этому мы быстро увидели три способа фильтрации текущих значений из потока из Необязательно .
Полную реализацию примеров кода можно найти в проекте Github .