Idiomatiques façon de gérer les valeurs null ou vide Liste dans Kotlin
Dire que j'ai une variable activities
de type List<Any>?
. Si la liste n'est pas nul et n'est pas vide, je veux faire quelque chose, sinon j'ai envie de faire autre chose. Je suis venu avec la solution suivante:
when {
activities != null && !activities.empty -> doSomething
else -> doSomethingElse
}
Est-il plus idiomatiques moyen de le faire dans Kotlin?
- Remarque: un
when
avec deux alternatives est très proche de la normaleif
Vous devez vous connecter pour publier un commentaire.
Pour quelques actions simples, vous pouvez utiliser le coffre-fort d'appel de l'opérateur, en supposant que l'action respecte aussi ne fonctionne pas sur une liste vide (pour le traitement de votre dossier de les deux nulle et vide:
Pour d'autres actions. vous pouvez écrire une fonction d'extension -- deux variantes, selon si vous souhaitez recevoir la liste
this
ou en tant que paramètre:Que vous pouvez utiliser comme:
Vous pouvez aussi faire l'inverse de la fonction:
Je voudrais éviter de le chaînage de ces, parce qu'alors vous remplacez un
if
ouwhen
déclaration avec quelque chose de plus verbeux. Et vous obtenez de plus en plus dans le domaine que les solutions de rechange que je mentionne ci-dessous donnent, qui est plein de ramification de la réussite/l'échec des situations.Remarque: ces extensions ont été généralisés à tous les descendants de
Collections
holding non les valeurs null. Et de travail pour plus que juste des Listes.Alternatives:
La Résultat bibliothèque de Kotlin donne une belle façon de gérer votre affaire", ou que" fondée sur les valeurs de réponse. Pour les Promesses, vous pouvez trouver la même chose dans le Kovenant de la bibliothèque.
Ces deux bibliothèques de vous donner de manière pour le retour alternative résultats à partir d'une seule fonction, et aussi pour la ramification, le code sur la base des résultats. Ils exigent que vous êtes en contrôle le fournisseur de la "réponse" qui est pris en compte.
Ce sont de bonnes Kotlin alternatives à
Optional
etMaybe
.À explorer l'extension de Fonctions (et peut-être de trop)
Cette section est de montrer que lorsque vous appuyez sur une question comme la question soulevée ici, vous pouvez facilement trouver beaucoup de réponses dans Kotlin pour faire du codage de la façon dont vous voulez qu'il soit. Si le monde n'est pas sympathique, changer le monde. Il n'est pas conçu comme une bonne ou une mauvaise réponse, mais plutôt des informations supplémentaires.
Si vous aimez les fonctions d'extension et d'envisager de chaîne dans une expression, je serais probablement modifier comme suit...
La
withXyz
saveurs de retourthis
et lawhenXyz
doit retourner un nouveau type permettant à l'ensemble de la collection pour devenir une nouvelle (peut-être même sans rapport avec l'original). Résultant dans un code comme suit:Remarque: le code complet de cette version est à la fin du poste (1)
Mais vous pouvez aussi aller une direction complètement nouvelle avec un custom "ce que" mécanisme:
Il n'y a pas de limites, d'être créatif et d'apprendre le pouvoir d'extensions, d'essayer de nouvelles idées, et comme vous pouvez le voir, il existe de nombreuses variantes à ce que les gens veulent de code de ce type de situations. Le stdlib ne peut pas supporter 8 variations de ce type de méthodes, sans être source de confusion. Mais chaque groupe de développement peuvent avoir des extensions qui correspondent à leur style de codage.
Remarque: le code complet de cette version est à la fin de la poste (2)
L'exemple de code 1: Voici le code complet pour le "enchaîné" version:
Exemple de Code 2: Voici le code complet pour un "autrement que" de la bibliothèque (avec l'unité de test):
Mise à JOUR:
kotlin 1.3
isNullOrEmpty
maintenant!https://twitter.com/kotlin/status/1050426794682306562
essayer cette! très claire.
val tmpArray = array.orEmpty()
isNullOrEmpty()
qui combine à la foisEn plus des autres réponses, vous pouvez également utiliser le coffre-opérateur d'appel en combinaison avec la méthode d'extension
isNotEmpty()
. En raison de la sécurité d'appel, la valeur de retour est en faitBoolean?
qui peut être soittrue
,false
ounull
. Pour utiliser l'expression dans unif
ouwhen
clause, vous devez explicitement vérifier si il esttrue
:Syntaxe Alternative à l'aide de l'elvis opérateur:
Plus de façon la plus simple serait,
isNotEmpty()
déjà renvoie un booléen, il n'y a pas besoin d'ajouter== true
. 🙂Envisager d'utiliser
?.forEach
le cas échéantSi vous voulez exactement le comportement que vous avez décrit, je pense que votre variante lit mieux puis autre chose de plus concis que je pense. (Et pourtant simple
if
devrait suffire)Dans mon cas les prix est une option.- Je traiter le cas de la manière suivante avec
orEmpty()
qui retourne le tableau ou d'un tableau vide si le tableau est null.La méthode à utiliser dans Kotlin 1.3 est
isNullOrEmpty
comme ce qui a été dit dans cette réponse: https://stackoverflow.com/a/48056456/2735286Voici un exemple de son utilisation:
Cet exemple affiche:
Tout d'abord je voulais conseillent d'en faire une extension de la fonction en plus de @mlatu réponse, qui gère
else
conditionMais l'usage en est pas si belle.
En fait vous êtes à la recherche pour l'un Peut-être monade