Фильтрация потока опций в 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.