1. Использование filter ()
Один из вариантов в Java 8 - отфильтровать значения с помощью Optional::isPresent
, а затем выполнить сопоставление с помощью функции Optional::get
для извлечения значения:
ArrayList<Test> testlist = valueList.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
2. Использование flatMap ()
Другой вариант - использовать flatMap с лямбда-выражением, которое преобразует пустое значение Optional в пустой экземпляр Stream и непустой Optional для экземпляра Stream, содержащего только один элемент:
ArrayList<Test> testlist = valueList.stream()
.flatMap(t -> t.isPresent() ? Stream.of(t.get()) : Stream.empty())
.collect(Collectors.toList());
Вы можете применить тот же подход, используя ссылку на метод для преобразования Optional в Stream:
ArrayList<Test> testlist = valueList.stream()
.flatMap(t -> t.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
3. Java 9 Optional :: stream
В Java 9 метод stream () был добавлен в класс Optional для улучшения его функциональности. аналогично показанному в разделе 2, но на этот раз мы используем предопределенный метод для преобразования экземпляра Optional в экземпляр Stream. Если Optional содержит значение, то верните Stream, содержащий это значение. В противном случае возвращается пустой поток.
ArrayList<Test> testlist = valueList.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());