103 votes

Plusieurs vérifications nulles dans Java 8

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?

176voto

Ravindra Ranwala Points 5765

Vous pouvez le faire comme ceci:

 String s = Stream.of(str1, str2, str3)
    .filter(Objects::nonNull)
    .findFirst()
    .orElse(str4);

74voto

Eran Points 35360

Qu'en est-il de l'opérateur conditionnel ternaire?

 String s = 
    str1 != null ? str1 : 
    str2 != null ? str2 : 
    str3 != null ? str3 : str4
;

35voto

ernest_k Points 14807

Vous pouvez également utiliser une boucle:

 String[] strings = {str1, str2, str3, str4};
for(String str : strings) {
    s = str;
    if(s != null) break;
}

27voto

Luis G. Points 3247

Les réponses actuelles sont bonnes, mais vous devriez vraiment mettre cela dans une méthode utilitaire:

 public static Optional<String> firstNonNull(String... strings) {
    return Arrays.stream(strings)
            .filter(Objects::nonNull)
            .findFirst();
}

Cette méthode est dans ma Util depuis des années, rend le code beaucoup plus propre:

 String s = firstNonNull(str1, str2, str3).orElse(str4);

Vous pouvez même le rendre générique:

 @SafeVarargs
public static <T> Optional<T> firstNonNull(T... objects) {
    return Arrays.stream(objects)
            .filter(Objects::nonNull)
            .findFirst();
}

// Use
Student student = firstNonNull(student1, student2, student3).orElseGet(Student::new);

13voto

Michael Anderson Points 21181

J'utilise une fonction d'aide, quelque chose comme

 T firstNonNull<T>(T v0, T... vs) {
  if(v0 != null)
    return v0;
  for(T x : vs) {
    if (x != null) 
      return x;
  }
  return null;
}

Ensuite, ce type de code peut être écrit comme

 String s = firstNonNull(str1, str2, str3, str4);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X