web-dev-qa-db-fra.com

Comment convertir une possible valeur nulle en une valeur par défaut en utilisant Guava?

Est-ce que Guava fournit une méthode pour obtenir une valeur par défaut si une référence d'objet passée est null? Je cherche quelque chose comme <T> T nullToDefault(T obj, T default), si par défaut est retourné si obj est null.

Ici, sur stackoverflow, je n'ai rien trouvé à ce sujet. Je ne cherche qu'une solution de goyave pure (s'il y en a)!

Je n'ai rien trouvé dans l'API Gauva 10, seulement com.google.common.base.Objects semble prometteur mais manque quelque chose de similaire.

53
Chriss

En plus de Objects.firstNonNull, Guava 10.0 a ajouté la classe Facultatif comme solution plus générale à ce type de problème.

Un Optional est quelque chose qui peut ou non contenir une valeur. Il existe différentes manières de créer une instance Optional, mais dans votre cas, la méthode d'usine Optional.fromNullable(T) est appropriée.

Une fois que vous disposez d'un Optional, vous pouvez utiliser l'une des méthodes or pour obtenir la valeur que contient le Optional (si elle contient une valeur) ou une autre valeur (si elle ne fait pas).

En mettant tout cela ensemble, votre exemple simple ressemblerait à:

T value = Optional.fromNullable(obj).or(defaultValue);

La flexibilité supplémentaire de Optional intervient si vous souhaitez utiliser un Supplier pour la valeur par défaut (donc vous ne faites pas le calcul pour l'obtenir sauf si nécessaire) ou si vous voulez enchaîner plusieurs ensemble des valeurs facultatives pour obtenir la première valeur présente, par exemple:

T value = someOptional.or(someOtherOptional).or(someDefault);
72
ColinD

Que diriez-vous

MoreObjects.firstNonNull(obj, default)

Voir JavaDoc .

(Note historique: la classe MoreObjects était autrefois appelée Objects, mais elle a été renommée pour éviter toute confusion avec Java.util.Objects classe introduite dans Java 7. La classe Guava Objects est désormais obsolète.)

57
Simon Nickerson

Comme dit précédemment, la solution Guava est correcte.

Il existe cependant une solution pure JDK avec Java 8:

Optional.ofNullable( var ).orElse( defaultValue );

Voir la documentation de Java.util.Optional

39
Nicolas Nobelis

Cela devrait faire l'affaire: Objects.firstNonNull(o, default)
Voir doc API Guava

9
Jens Hoffmann

Si votre objet n'est pas déjà facultatif, les suggestions Facultatif/firstNotNull compliquent ce qu'est une simple fonction Java, l'opérateur ternaire:

T myVal = (val != null) ? val : defaultVal;

L'inclusion d'une dépendance et de plusieurs appels de méthodes introduit autant de complexité de lecture que l'opérateur ternaire. Je dirais même que l'utilisation de Optional contrairement à sa 'ma méthode peut ou peut ne pas retourner un objet' est un drapeau rouge indiquant que vous faites quelque chose de mal (tout comme dans d'autres cas où l'on abuse de quelque chose de contraire à sens sémantique de cette chose).

Voir http://alvinalexander.com/Java/edu/pj/pj010018 pour plus de discussion sur l'opérateur ternaire.

8
MonkeyWithDarts

Si vous ne parlez que de chaînes, il existe également des méthodes Apache Commons defaultString et defaultIfEmpty

defaultString vous donnera uniquement la valeur par défaut sur un vrai null tandis que defaultIfEmpty vous donnera la valeur par défaut sur une chaîne nulle ou vide.

Il y a aussi defaultIfBlank qui vous donnera la valeur par défaut même sur une chaîne vide.

par exemple.

String description = "";
description = StringUtils.defaultIfBlank(description, "Theodore"); 

la description sera désormais égale à "Theodore"

Edit: Apache Commons a également une classe ObjectUtils qui fait des valeurs par défaut nulles pour les objets entièrement cuits ...

7
Daniel Schmidt

Juste pour info, Java 9 a deux méthodes qui font exactement ce que vous voulez:

public static <T> T requireNonNullElse(T obj, T defaultObj);

Et une version paresseuse:

public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
6
ZhekaKozlov

Java.util.Objects et Guava's facultatifs fournissent une bonne façon d'obtenir le remplacement de null aux valeurs par défaut ... en les utilisant beaucoup

Mais voici quelque chose pour un esprit plus impératif:

public static <T> T firstNotNuLL(T...args){
    for (T arg : args)
        if ( arg != null) return arg;
    throw new NullPointerException();  
}
3
kunwar.sangram

Pensez à utiliser le Optional intégré à Guava 10. Vous pouvez enchaîner plusieurs options, comme Optional.fromNullable(var).orNull() ou Optional.fromNullable(var).or(Optional.of(var2)).orNull()

1
Ray

Vous pouvez utiliser la bibliothèque ObjectUtils.defaultIfNull() de org.Apache.commons.lang :

public static <T> T defaultIfNull(T object, T defaultValue)
0
Lu55