Sobes.tech
Middle

Que savez-vous de la classe Optional ?

sobes.tech IA

Réponse de l'IA

Optional<T> est une classe conteneur qui peut contenir une valeur non nulle de type T ou être vide. Elle a été ajoutée en Java 8 pour résoudre le problème des pointeurs null.

Méthodes principales :

  • of(T value): Crée un Optional avec une valeur non nulle. Lance une NullPointerException si la valeur est null.
  • ofNullable(T value): Crée un Optional avec une valeur non nulle si elle existe, ou un Optional vide si la valeur est null.
  • empty(): Crée un Optional vide.
  • isPresent(): Retourne true si la valeur est présente, sinon false.
  • isEmpty(): Retourne true si la valeur est absente, sinon false (ajouté en Java 11).
  • get(): Retourne la valeur si elle est présente, sinon lance une NoSuchElementException.
  • orElse(T other): Retourne la valeur si elle est présente, sinon retourne other.
  • orElseGet(Supplier<? extends T> other): Retourne la valeur si elle est présente, sinon exécute et retourne le résultat du Supplier. Préféré à orElse(T other) lorsque l'initialisation de other est coûteuse.
  • orElseThrow(Supplier<? extends X> exceptionSupplier): Retourne la valeur si elle est présente, sinon lance l'exception fournie par exceptionSupplier.

Exemple d'utilisation pour éviter NullPointerException :

// Au lieu de
User user = findUserById(userId);
if (user != null) {
    String email = user.getEmail();
    // ...
}

// On peut utiliser Optional
Optional<User> userOptional = findUserByIdOptional(userId);
userOptional.ifPresent(user -> {
    String email = user.getEmail();
    // ...
});

Comparaison entre orElse et orElseGet :

// Les deux appels retourneront DefaultUser si optionalUser est vide
// Mais dans le cas de orElse, new DefaultUser() sera toujours appelé,
// même si optionalUser contient une valeur
User user1 = optionalUser.orElse(new DefaultUser());

// Dans le cas de orElseGet, new DefaultUser() ne sera appelé
// que si optionalUser est vide
User user2 = optionalUser.orElseGet(() -> new DefaultUser());

Optional aide à rendre le code plus lisible et sûr, en indiquant explicitement que la valeur peut être absente. Il ne doit pas être utilisé pour les champs de classe ou les paramètres de méthode si l'absence de valeur est une situation exceptionnelle.