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.