Classe Optional améliorée de Java 9

Java 9 新特性Nouveautés de Java 9

La classe Optional a été introduite dans Java 8. L'introduction de la classe Optional résout efficacement l'exception de pointeur null. Dans Java 9, trois méthodes ont été ajoutées pour améliorer ses fonctionnalités :

  • stream()
  • ifPresentOrElse()
  • or()

méthode stream()

Syntaxe

public Stream<T> stream()

La méthode stream convertit un Optional en un Stream. Si l'Optional contient une valeur, elle renvoie un Stream contenant cette valeur ; sinon, elle renvoie un Stream vide (Stream.empty()).

Exemple

import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; public class Tester { public static void main(String[] args) { List<Optional<String>> list = Arrays.asList ( Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B")); //filtrer la liste pour afficher les valeurs non vides //si optional n'est pas vide, récupérer la valeur dans stream, sinon renvoyer vide List<String> filteredList = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); //La méthode Optional::stream retournera un flux d'un //ou zéro élément selon que des données sont présentes ou non. List<String> filteredListJava9 = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList()); System.out.println(filteredList⟦⟧System); System.out.println(filteredJava9); } }

Le résultat de sortie de l'exécution est :

[A, B]
[A, B]

ifPresentOrElse()

Syntaxe

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

L'amélioration apportée par ifPresentOrElse est qu'il possède un else, acceptant deux paramètres : Consumer et Runnable.

Le but de la méthode ifPresentOrElse est : si un Optional contient une valeur, la fonction est appelée sur la valeur contenue, c'est-à-dire action.accept, ce qui est cohérent avec ifPresent ; la différence avec la méthode ifPresent est que ifPresentOrElse possède aussi une emptyAction — si l'Optional ne contient pas de valeur, ifPresentOrElse appelle emptyAction, c'est-à-dire emptyAction.run().

Exemple

import java.util.Optional; public class Tester { public static void main(String[] args) { Optional<Integer> optional = Optional.of(1); optional.ifPresentOrElse( x -> System.out.println("Valeur : " + x),() -> System.out.println("Non présent.")); optional = Optional.empty(); optional.ifPresentOrElse( x -> System.out.println("Valeur : " + x),() -> System.out.println("Non présent.")); } }

Le résultat de sortie de l'exécution est :

Value: 1
Not Present.

méthode or()

Syntaxe

public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

Si une valeur existe, retourne la valeur spécifiée par Optional ; sinon, retourne une valeur prédéfinie.

Exemple

import java.util.Optional; import java.util.function.Supplier; public class Tester { public static void main(String[] args) { Optional<String> optional1 = Optional.of("Mahesh"); Supplier<Optional<String>> supplierString = () -> Optional.of("Non présent"); optional1 = optional1.or( supplierString); optional1.ifPresent( x -> System.out.println("Valeur : " + x)); optional1 = Optional.empty(); optional1 = optional1.or( supplierString); optional1.ifPresent( x -> System.out.println("Valeur : " + x)); } }

Le résultat de sortie de l'exécution est :

Value: Mahesh
Value: Not Present

Java 9 新特性Nouveautés de Java 9