Comment faire pour convertir un null possible de la valeur à une valeur par défaut à l'aide de Goyave?
Ne Goyave fournir une méthode pour obtenir une valeur par défaut si le passé de l'objet de référence est null
? Je suis à la recherche de quelque chose comme <T> T nullToDefault(T obj, T default)
, ont été les par défaut est retournée si obj est null
.
Ici sur stackoverflow je n'ai rien trouvé à ce sujet. Je suis seulement à la recherche d'un pur Goyave solution (si il y en a)!
Je n'ai rien trouvé dans le Gauva 10 API com.google.common.base.Objects
semble prometteur mais il lui manque quelque chose de similaire.
Vous devez vous connecter pour publier un commentaire.
En plus
Objects.firstNonNull
, Goyave 10.0 ajouté le En option classe comme une solution générale à ce type de problème.Un
Optional
est quelque chose qui peut ou peut ne pas contenir une valeur. Il existe différentes façons de créer unOptional
exemple, mais pour votre cas, la méthode de fabriqueOptional.fromNullable(T)
est approprié.Une fois que vous avez un
Optional
, vous pouvez utiliser l'un desor
méthodes pour obtenir la valeur de laOptional
contient (si elle contient une valeur) ou une autre valeur (si elle ne fait pas).Mettre tous ensemble, votre exemple simple serait:
La plus grande flexibilité de
Optional
vient si vous souhaitez utiliser unSupplier
pour la valeur par défaut (si vous ne faites pas le calcul pour l'obtenir, sauf si nécessaire) ou si vous voulez à la chaîne de multiples valeurs facultatives pour obtenir la première valeur qui est présent, par exemple:Optional
instances de types différents paramètres? Je ne le pense pas, parce que c'est lié au type de T? Nous devons attendre pour le elvis-opérateur en java 8+.Pet pet = Optional.fromNullable(cat).or(Optional.fromNullable(dog)).orNull()
, oùCat
etDog
à la fois d'étendrePet
. Il semble que vous devriez avoir à jeter la première option comme unPet
premier, alors vous feriez bien de là.Comment sur
Voir le JavaDoc.
(Note historique: la
MoreObjects
de classe utilisé pour être appeléObjects
, mais il a été renommé pour éviter la confusion avec lejava.util.Les objets
classe introduite dans Java 7. La GoyaveObjects
classe est à présent obsolète.)MoreObjects.firstNonNull(obj, default)
Comme dit précédemment, la Goyave, la solution est correcte.
Il y a cependant une pur JDK solution avec Java 8 :
Voir la documentation de
java.util.Optional
Cela devrait faire l'affaire:
Objects.firstNonNull(o, default)
Voir goyave doc API
Si votre objet n'est pas déjà une Option, puis l'Option/firstNotNull suggestions de compliquer ce qui est une simple fonctionnalité, l'opérateur ternaire:
Y compris une dépendance et plusieurs appels de méthodes introduit comme beaucoup de lecture de la complexité que l'opérateur ternaire. Je dirais même affirment que l'utilisation de
Optional
contrairement à son " ma méthode peut ou peut ne pas retourner un objet sémantique est un drapeau rouge que vous faites quelque chose de mal (tout comme dans d'autres cas où l'un abus quelque chose de contraire à cette chose de la signification sémantique).Voir http://alvinalexander.com/java/edu/pj/pj010018 pour plus de discussion sur l'opérateur ternaire.
Optional.ofNullable( superExpensiveMethod() ).orElse( defaultValue );
Avec ternaire, vous devez le mettre dans une variable de première.Si vous êtes seulement de parler, à propos des Chaînes, il y a aussi d'Apache Commons defaultString et defaultIfEmpty méthodes
defaultString ne fera que vous donner la valeur par défaut sur un vrai nuls alors que defaultIfEmpty vous donnera la valeur par défaut sur une valeur null ou une chaîne vide.
Il est également defaultIfBlank qui vous donnera la valeur par défaut, même sur une chaîne vide.
par exemple
description sera désormais égal "Théodore"
Edit:
Apache Commons a aussi un ObjectUtils classe qui fait la valeur null par défaut pour les objets ancrés...
Juste pour info, Java 9 a deux méthodes qui font exactement ce que vous voulez:
Et un paresseux version:
java.util.Des objets et la Goyave, en option, offrent de la bonne façon pour se substituant la valeur null pour les valeurs par défaut... utilise beaucoup
Mais voici quelque chose de plus impératif à l'esprit :
Envisager l'utilisation de la
Optional
construit en Goyave 10. Vous pourriez enchaîner de multiples options, commeOptional.fromNullable(var).orNull()
ouOptional.fromNullable(var).or(Optional.of(var2)).orNull()
Vous pouvez utiliser
ObjectUtils.defaultIfNull()
de org.apache.commons.lang3 bibliothèque: