Filtrer un flux d’options en Java

Filtrage d'un flux d'options en Java

1. introduction

Dans cet article, nous allons expliquer comment filtrer les valeurs non vides d'unStream deOptionals.

Nous examinerons trois approches différentes: deux utilisant Java 8 et l’autre utilisant la nouvelle prise en charge de Java 9.

Nous allons travailler sur la même liste dans tous les exemples:

List> listOfOptionals = Arrays.asList(
  Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));

2. Utilisation defilter()

L'une des options de Java 8 consiste à filtrer les valeurs avecOptional::isPresent, puis à effectuer un mappage avec la fonctionOptional::get pour extraire les valeurs:

List filteredList = listOfOptionals.stream()
  .filter(Optional::isPresent)
  .map(Optional::get)
  .collect(Collectors.toList());

3. Utilisation deflatMap()

L'autre option serait d'utiliserflatMap avec une expression lambda qui convertit unOptional vide en une instanceStream vide et unOptional non vide enStream instance contenant un seul élément:

List filteredList = listOfOptionals.stream()
  .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
  .collect(Collectors.toList());

Vous pouvez également appliquer la même approche en utilisant une manière différente de convertir unOptional enStream:

List filteredList = listOfOptionals.stream()
  .flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
  .collect(Collectors.toList());

4. Java 9's Optional :: stream

Tout cela sera assez simplifié avec l'arrivée de Java 9 qui ajoute une méthodestream() àOptional.

Cette approche est similaire à celle présentée dans la section 3, mais cette fois, nous utilisons une méthode prédéfinie pour convertir une instance deOptional en une instance deStream:

Il renverra un flux d'un ou de zéro élément (s), que la valeurOptional soit ou non présente:

List filteredList = listOfOptionals.stream()
  .flatMap(Optional::stream)
  .collect(Collectors.toList());

5. Conclusion

Avec cela, nous avons rapidement vu trois façons de filtrer les valeurs actuelles sur unStream deOptionals.

L'implémentation complète des exemples de code peut être trouvée sur lesGithub project.