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 unOptionalavec une valeur non nulle. Lance uneNullPointerExceptionsi la valeur estnull.ofNullable(T value): Crée unOptionalavec une valeur non nulle si elle existe, ou unOptionalvide si la valeur estnull.empty(): Crée unOptionalvide.isPresent(): Retournetruesi la valeur est présente, sinonfalse.isEmpty(): Retournetruesi la valeur est absente, sinonfalse(ajouté en Java 11).get(): Retourne la valeur si elle est présente, sinon lance uneNoSuchElementException.orElse(T other): Retourne la valeur si elle est présente, sinon retourneother.orElseGet(Supplier<? extends T> other): Retourne la valeur si elle est présente, sinon exécute et retourne le résultat duSupplier. Préféré àorElse(T other)lorsque l'initialisation deotherest coûteuse.orElseThrow(Supplier<? extends X> exceptionSupplier): Retourne la valeur si elle est présente, sinon lance l'exception fournie parexceptionSupplier.
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.