MĂșltiples cheques nulos en Java 8
java-8 (8)
Tengo el siguiente código que es poco feo para múltiples cheques nulos.
String s = null;
if (str1 != null) {
s = str1;
} else if (str2 != null) {
s = str2;
} else if (str3 != null) {
s = str3;
} else {
s = str4;
}
Así que intenté usar
Optional.ofNullable
como abajo, pero aún es difícil de entender si alguien lee mi código.
¿Cuál es el mejor enfoque para hacer eso en Java 8?
String s = Optional.ofNullable(str1)
.orElse(Optional.ofNullable(str2)
.orElse(Optional.ofNullable(str3)
.orElse(str4)));
En Java 9, podemos usar
Optional.ofNullable
con
OR
, pero en Java8, ¿hay algún otro enfoque?
¿Y el operador condicional ternario?
String s =
str1 != null ? str1 :
str2 != null ? str2 :
str3 != null ? str3 : str4
;
Las respuestas actuales son buenas, pero realmente deberías poner eso en un método de utilidad:
public static Optional<String> firstNonNull(String... strings) {
return Arrays.stream(strings)
.filter(Objects::nonNull)
.findFirst();
}
Ese método ha estado en mi clase de
Util
por años, hace que el código sea mucho más limpio:
String s = firstNonNull(str1, str2, str3).orElse(str4);
Incluso puedes hacerlo genérico:
@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);
Método basado y simple.
String getNonNull(String def, String ...strings) {
for(int i=0; i<strings.length; i++)
if(strings[i] != null)
return s[i];
return def;
}
Y utilízalo como:
String s = getNonNull(str4, str1, str2, str3);
Es simple de hacer con matrices y se ve bonita.
Puedes hacerlo así:
String s = Stream.of(str1, str2, str3)
.filter(Objects::nonNull)
.findFirst()
.orElse(str4);
También puede agrupar todas las cadenas en una matriz de cadenas, luego hacer un ciclo for para verificar y romper el ciclo una vez que se haya asignado. Suponiendo que s1, s2, s3, s4 son todas las cadenas.
String[] arrayOfStrings = {s1, s2, s3};
s = s4;
for (String value : arrayOfStrings) {
if (value != null) {
s = value;
break;
}
}
Editado para lanzar en condición de predeterminado a s4 si no se asigna ninguno.
También puede utilizar un bucle:
String[] strings = {str1, str2, str3, str4};
for(String str : strings) {
s = str;
if(s != null) break;
}
Una solución que puede aplicarse a tantos elementos como desee puede ser:
Stream.of(str1, str2, str3, str4)
.filter(Object::nonNull)
.findFirst()
.orElseThrow(IllegalArgumentException::new)
Podría imaginar una solución como la que se muestra a continuación, pero la primera garantiza la
non nullity
de todos los elementos.
Stream.of(str1, str2, str3).....orElse(str4)
Yo uso una función de ayuda, algo así como
T firstNonNull<T>(T v0, T... vs) {
if(v0 != null)
return v0;
for(T x : vs) {
if (x != null)
return x;
}
return null;
}
Entonces este tipo de código se puede escribir como
String s = firstNonNull(str1, str2, str3, str4);