«1. Введение
В этой статье мы поговорим о том, как отфильтровать непустые значения из потока опционов.
Мы рассмотрим три разных подхода — два с использованием Java 8 и один с новой поддержкой в Java 9.
Мы будем работать с одним и тем же списком во всех примерах:
List<Optional<String>> listOfOptionals = Arrays.asList(
Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2. Использование filter()
Один из вариантов в Java 8 — отфильтровать значения с помощью Optional::isPresent, а затем выполнить сопоставление с помощью функции Optional::get для извлечения значений:
List<String> filteredList = listOfOptionals.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
3. Использование flatMap()
Другим вариантом может быть использование flatMap с лямбда-выражением, которое преобразует пустой необязательный параметр в пустой экземпляр Stream, а непустой необязательный элемент — в экземпляр Stream, содержащий только один элемент:
List<String> filteredList = listOfOptionals.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
В качестве альтернативы вы можете применить тот же подход, используя другой способ преобразования Optional в Stream: метод stream() на необязательный.
List<String> filteredList = listOfOptionals.stream()
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
Этот подход похож на тот, что показан в разделе 3, но на этот раз мы используем предопределенный метод для преобразования экземпляра Optional в экземпляр Stream: Необязательное значение присутствует или отсутствует:
5. Заключение
Таким образом, мы быстро рассмотрели три способа фильтрации текущих значений из Потока Необязательных.
Полную реализацию примеров кода можно найти в проекте Github.
List<String> filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
«
With this, we’ve quickly seen three ways of filtering the present values out of a Stream of Optionals.
The full implementation of code samples can be found on the Github project.