Consultez les notes de la classe java.util.Optional

Aperçu

Ceci est une note de révision de la classe java.util.Optional introduite dans Java 1.8.

environnement

référence

Optional<T> - Java 1.8

empty / of / ofNullable

Les deux sont des méthodes statiques. Facultatif n'a pas de constructeur public, utilisez donc ces méthodes pour créer un objet Facultatif.

empty

Renvoie un objet facultatif avec une valeur nulle.

Optional<String> empty = Optional.empty();
empty.isPresent();
// false

empty.orElse("other");
// other

empty.get();
// java.util.NoSuchElementException: No value present

of

Renvoie un objet facultatif avec une valeur non nulle.

String str = "nonNull";
Optional<String> nonNullString = Optional.of(str);
nonNullString.isPresent();
// true

nonNullString.get();
// result : nonNull

La transmission d'un objet nul à of lève une exception.

String str = null;
Optional.of(str);
//  java.lang.NullPointerException

ofNullable

Renvoie un objet facultatif avec une valeur qui peut être nulle (nullable).

String str = null;
Optional<String> nullableString = Optional.ofNullable(str);
nullableString.isPresent();
// false

nullableString.orElse("other");
// other

get / isPresent

get

Renvoie la valeur détenue par l'objet facultatif. Si la valeur à conserver est null, une NoSuchElementException sera levée.

String str = "apple";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.get();
// apple
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.get();
// java.util.NoSuchElementException: No value present

isPresent

Renvoie true si la valeur détenue par l'objet facultatif est non nulle, false si elle est nulle.

String str = "apple";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.isPresent();
// true
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.isPresent();
// false

orElse / orElseGet / orElseThrow

orElse

Renvoie la valeur détenue par l'objet facultatif. Si la valeur à conserver est nulle, la valeur spécifiée est renvoyée. (Null est également possible)

String str = "nonNull";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElse("other");
// nonNull
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElse("other");
// other

nullableString.orElse(null);
// null

orElseGet

Renvoie la valeur détenue par l'objet facultatif. Si la valeur à conserver est nulle, le résultat du fournisseur spécifié est renvoyé. Si le fournisseur renvoie null, il renverra null.

String str = "nonNull";
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElseGet(() -> "other");
// nonNull
String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElseGet(() -> "other");
// other

nullableString.orElseGet(() -> null);
// null

orElseThrow

Renvoie la valeur détenue par l'objet facultatif. Si la valeur à conserver est nulle, l'exception spécifiée sera levée.

String str = null;
Optional<String> nullableString = Optional.ofNullable(str);

nullableString.orElseThrow(RuntimeException::new);
// java.lang.RuntimeException

ifPresent

Si la valeur détenue par l'objet facultatif n'est pas nulle, le bloc de traitement consommateur spécifié dans l'argument est exécuté avec cette valeur. Si la valeur détenue par l'objet facultatif est nulle, aucune exception n'est levée et rien n'est exécuté.

Optional<Employee> employee = Optional.ofNullable(new Employee(1L, "john"));
employee.ifPresent((e) -> {
    e.setName(e.getName().toUpperCase());
    System.out.println(e);
    // Employee{id=1, name='JOHN'}
});

filter / map / flatMap

filter

Si la valeur détenue par l'objet facultatif est non nulle, le bloc de traitement Predicate spécifié dans l'argument avec cette valeur est exécuté.

Optional<String> nullableString = Optional.ofNullable("banana");

Optional<String> filtering = nullableString.filter(str -> str.length() > 5);
filtering.isPresent();
// true

filtering.orElse("other");
// banana

Si la valeur détenue par l'objet facultatif est nulle ou si le bloc de traitement Predicate renvoie false, un facultatif vide est renvoyé.

Optional<String> nullableString = Optional.ofNullable("apple");
// Optional<String> nullableString = Optional.ofNullable(null);

Optional<String> filtering = nullableString.filter(str -> str.length() > 5);
filtering.isPresent();
// false

filtering.orElse("other");
// other

map

Si la valeur détenue par l'objet facultatif est non nulle, le bloc de traitement de la fonction spécifié dans l'argument est exécuté avec cette valeur.

Optional<String> nullableString = Optional.ofNullable("apple");
Optional<Integer> mapping = nullableString.map(str -> str.length());

mapping.isPresent();
// true

mapping.orElse(0);
// 5

Si la valeur détenue par l'objet facultatif est nulle ou si le bloc de traitement de la fonction renvoie null, un facultatif vide est renvoyé.

Optional<String> nullableString = Optional.ofNullable(null);
Optional<Integer> mapping = nullableString.map(str -> str.length());

mapping.isPresent();
// false

mapping.orElse(0);
// 0

flatMap

Si la valeur détenue par l'objet facultatif est non nulle, le bloc de traitement de la fonction spécifié dans l'argument est exécuté avec cette valeur. La différence avec la carte est que Function renvoie un objet facultatif.

La fonction spécifiée dans la carte prend le type T et renvoie le type U.

Function<? super T,? extends U> mapper

La fonction spécifiée dans flatMap prend le type T et renvoie le type facultatif .

Function<? super T,Optional<U>> mapper
Optional<Long> optId = Optional.of(1L);
Optional<String> optName = Optional.of("john");

Optional<Employee> result = optId.flatMap(id -> optName.flatMap(name -> Optional.of(new Employee(id, name))));

result.isPresent();
// true

result.orElse(null);
// Employee{id=1, name='john'}

Si la valeur détenue par l'objet facultatif est nulle, un facultatif vide est renvoyé.

Optional<Long> optId = Optional.of(1L);
Optional<String> optName = Optional.ofNullable(null);

Optional<Employee> result = optId.flatMap(id -> optName.flatMap(name -> Optional.of(new Employee(id, name))));

result.isPresent();
// false

result.orElse(null);
// null

Si vous utilisez une fonction qui renvoie Facultatif dans la carte, la valeur de retour sera d'un type inattendu.

Optional<Optional<String>> nullableName = employee.map(emp -> Optional.ofNullable(emp.getName()));

API ajoutée dans Java 9

ifPresentOrElse

Il existe plus de variantes de ifPresent. Si la valeur détenue par l'objet facultatif est nulle, le bloc de traitement exécutable spécifié dans l'argument est exécuté.

Optional<Employee> employee = Optional.ofNullable(null);

employee.ifPresentOrElse((e) -> {
    e.setName(e.getName().toUpperCase());
    System.out.println(e);
},
() -> {
    System.out.println("empty action");
    // empty action
});

or

Si la valeur détenue par l'objet facultatif est nulle, l'objet facultatif généré par le fournisseur spécifié dans l'argument est renvoyé. Une exception sera levée si le fournisseur renvoie null.

String str = null;
Optional<String> nonNullString = Optional.ofNullable(str).or(() -> Optional.of("nonNull"));

nonNullString.isPresent();
// true

nonNullString.get();
// nonNull

stream

Si la valeur détenue par l'objet facultatif est non nulle, un flux avec uniquement cette valeur est renvoyé, et si elle est nulle, un flux vide est renvoyé.

List<Optional<String>> list = List.of(
    Optional.of("a"),
    Optional.of("b"),
    Optional.of("c"),
    Optional.empty(),
    Optional.of("e"),
    Optional.empty(),
    Optional.of("g")
);

list.stream().filter(Optional::isPresent).map(Optional::get).forEach(System.out::println);
// a
// b
// c
// e
// g

//Lors de l'utilisation de stream
list.stream().flatMap(Optional::stream).forEach(System.out::println);
// a
// b
// c
// e
// g

API ajoutée dans Java 10

  • Module: java.base
  • Paquet: java.util

orElseThrow

Renvoie la valeur détenue par l'objet facultatif. Si la valeur à conserver est null, une NoSuchElementException sera levée. Ce comportement est le même que celui de la méthode get. Pour cette raison, plutôt que d'ajouter une variante de orElseThrow avec le même nom de méthode à partir de Java 1.8

java1.8_orElseThrow signature


public <X extends Throwable> T orElseThrow​(Supplier<? extends X> exceptionSupplier)
    throws X extends Throwable

Cela ressemble à une méthode qui remplace la méthode get, qui supprime l'ambiguïté du nom de la méthode get.

java1.8_obtenir la signature


public T get()

Vous pouvez voir que orElseThrow peut lever une exception à partir du nom de la méthode.

java10_orElseThrow signature


public T orElseThrow()

API ajoutée dans Java 11

isEmpty

java11_isEmpty signature


public boolean isEmpty()

Renvoie vrai si la valeur n'existe pas.

API ajoutée dans Java 12

Aucune API n'a été ajoutée.

API ajoutée dans Java 13

Aucune API n'a été ajoutée.

API ajoutée dans Java 14

Aucune API n'a été ajoutée.

Autres notes d'examen

Recommended Posts

Consultez les notes de la classe java.util.Optional
Consulter les notes de la classe java.util.Scanner
Une note de révision pour la classe java.util.Objects
Consulter les notes du package java.time.temporal
Une note sur la classe Utils libGDX
Remarques sur la portée
Remarque sur l'initialisation des champs dans le didacticiel Java
Une note de révision de l'interface Spring Framework Resource
Un murmure sur la classe utilitaire
Notes pour ceux qui vivent avec JMockit
Une note lorsque la commande heroku devient indisponible
Un examen rapide de Java appris en classe
Un mémo sur le flux de Rails et Vue
Résoudre le problème de l'accès aléatoire lent pour linkedList, une classe de type collection
[Pour les débutants] Où vérifier lorsqu'une classe est introuvable au moment de la compilation
Une revue du code utilisé par les rails débutants
J'ai créé un outil de vérification pour le module de version
Un examen rapide de Java appris en classe part4
J'ai lu le code lisible, alors prends note
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
Comment faire un MOD pour Slay the Spire
À propos de la classe StringBuilder
Note n ° 6 "Calculez la formule de la différence de somme à un chiffre reçue sous forme de chaîne de caractères" [Java]
Examen de la classe interne Java
Classe imbriquée (pour moi)
SDWebImage: Comment vider le cache pour une UIImageView particulière
Une note sur la fonction de départ de Ruby on Rails
J'ai essayé JAX-RS et pris note de la procédure
Je veux donner un nom de classe à l'attribut select
J'ai étudié Randoop, un générateur de classe de test JUnit pour Java.
Un mémorandum pour atteindre le lieu qui démange pour Java Gold
Viser une compréhension de base du flux de traitement récursif
Un examen de 25 jours et les efforts futurs pour Keycloak de NRI Open Standia
Avec le logiciel que je fais depuis longtemps ...
Modéliser Digimon avec DDD pour la première fois Partie 1