J'ai le code ci-dessous qui est un peu moche pour plusieurs vérifications nulles.
String s = null;
if (str1 != null) {
s = str1;
} else if (str2 != null) {
s = str2;
} else if (str3 != null) {
s = str3;
} else {
s = str4;
}
J'ai donc essayé d'utiliser Optional.ofNullable
comme ci-dessous, mais c'est toujours difficile à comprendre si quelqu'un lit mon code. quelle est la meilleure approche pour le faire dans Java 8.
String s = Optional.ofNullable(str1)
.orElse(Optional.ofNullable(str2)
.orElse(Optional.ofNullable(str3)
.orElse(str4)));
En Java 9, nous pouvons utiliser Optional.ofNullable
avec OR
, Mais en Java8, existe-t-il une autre approche?
or
syntaxe Java9String s = Optional.ofNullable(str1) .or(() -> Optional.ofNullable(str2)) .or(() -> Optional.ofNullable(str3)) .orElse(str4);
ne semble pas aussi bonne que laStream.of
sya je le ferais.StringUtils.firstNonBlank()
Réponses:
Vous pouvez le faire comme ceci:
la source
{str1, str2, str3}
) semblent beaucoup plus lents qu'unif
ou local?:
, que le runtime Java peut optimiser. Existe-t-il une optimisation spécifique à Streamjavac
et le runtime Java qui le rendent aussi rapide que?:
? Sinon, je ne recommanderai pas cette solution dans un code critique pour les performances.?:
code et je suis sûr que vous devriez l'éviter dans le code critique pour les performances. Il est cependant beaucoup plus lisible et vous devriez le recommander dans un code IMO non critique pour les performances, qui, j'en suis sûr, fait plus de 99% du code.javac
ni dans le runtime. Cela n'exclut pas les optimisations générales, comme l'inclusion de tout le code, suivies de l'élimination des opérations redondantes. En principe, le résultat final pourrait être aussi efficace que les expressions conditionnelles simples, cependant, il est plutôt improbable qu'il y parvienne un jour, car le runtime consacrerait l'effort nécessaire uniquement sur les chemins de code les plus chauds.str4
des paramètresStream.of(...)
et de l'utiliserorElse(null)
à la fin.Qu'en est-il de l'opérateur conditionnel ternaire?
la source
// take first non-null of str1..3
. Une fois que vous savez ce qu'il fait, il devient facile de voir comment.?:
échelle, vous saurez ce qu'elle fait. (Btw, les programmeurs fonctionnels connaissent cela comme des(cond ...)
clauses: c'est toujours une garde suivie de la valeur appropriée à utiliser lorsque la garde est vraie.)Vous pouvez également utiliser une boucle:
la source
Les réponses actuelles sont bonnes, mais vous devriez vraiment mettre cela dans une méthode utilitaire:
Cette méthode est dans ma
Util
classe depuis des années, rend le code beaucoup plus propre:Vous pouvez même le rendre générique:
la source
Arrays.stream()
quand je peux faire la même chose avec afor
et a!= null
, ce qui est plus efficace. Et Todd aurait raison. Cependant, lorsque j'ai codé cette méthode, je cherchais un moyen de le faire en utilisant les fonctionnalités de Java 8, tout comme OP, donc il y a ça.J'utilise une fonction d'aide, quelque chose comme
Ensuite, ce type de code peut être écrit comme
la source
v0
paramètre supplémentaire ?min
comme exemple.) Je suis moins convaincu que cela est approprié ici.firstNonNull(arr)
renvoyer arr s'il n'est pas nul. Si c'était le cas,firstNonNull(T... vs)
il renverrait à la place la première entrée non nulle dans arr.Une solution qui peut être appliquée à autant d'éléments que vous le souhaitez peut être:
Vous pourriez imaginer une solution comme ci-dessous, mais la première assure
non nullity
pour tous les élémentsla source
str4
du fait qu'il soit nul en faitorElseNull
, ce qui revient au même sistr4
est nul.Vous pouvez également regrouper toutes les chaînes dans un tableau de chaînes, puis effectuer une boucle for pour vérifier et rompre la boucle une fois qu'elle est affectée. En supposant que s1, s2, s3, s4 sont toutes des chaînes.
Modifié pour mettre la condition par défaut à s4 si aucune n'est attribuée.
la source
s4
(oustr4
), qui doit être attribué às
la fin, même s'il est nul.Basé sur une méthode et simple.
Et utilisez-le comme:
C'est simple à faire avec des tableaux et c'est joli.
la source
Si vous utilisez Apache Commons Lang 3, cela peut être écrit comme ceci:
L'utilisation de a
ObjectUtils.firstNonNull(T...)
été tirée de cette réponse . Différentes approches ont également été présentées dans des questions connexes .la source