Filtrando um fluxo de opcionais em Java

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.