Filtrando um fluxo de opcionais em Java
1. Introdução
Neste artigo, vamos falar sobre como filtrar valores não vazios deStream deOptionals.
Veremos três abordagens diferentes - duas usando Java 8 e uma usando o novo suporte em Java 9.
Trabalharemos na mesma lista em todos os exemplos:
List> listOfOptionals = Arrays.asList(
Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2. Usandofilter()
Uma das opções em Java 8 é filtrar os valores comOptional::isPresente, em seguida, realizar o mapeamento com a funçãoOptional::get para extrair valores:
List filteredList = listOfOptionals.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
3. UsandoflatMap()
A outra opção seria usarflatMap com uma expressão lambda que converte umaOptional vazia em uma instânciaStream vazia eOptional não vazia em aStreaminstância s contendo apenas um elemento:
List filteredList = listOfOptionals.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
Como alternativa, você pode aplicar a mesma abordagem usando uma maneira diferente de converter umOptional emStream:
List filteredList = listOfOptionals.stream()
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
4. Opcional :: stream do Java 9
Tudo isso ficará bastante simplificado com a chegada do Java 9 que adiciona um métodostream() aOptional.
Esta abordagem é semelhante à mostrada na seção 3, mas desta vez estamos usando um método predefinido para converter a instânciaOptional em uma instânciaStream:
Ele retornará um fluxo de um ou zero elemento (s) se o valorOptional estiver ou não presente:
List filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
5. Conclusão
Com isso, vimos rapidamente três maneiras de filtrar os valores presentes deStream deOptionals.
A implementação completa dos exemplos de código pode ser encontrada emGithub project.