parameter java null nullable

parameter - @notnull java



¿Cómo verificar múltiples objetos por nulidad? (5)

En Java 8, puede usar Stream.allMatch para verificar si todos los valores coinciden con una determinada condición, como ser null . No mucho más corto, pero tal vez un poco más fácil de leer.

if (Stream.of(a, b, c).allMatch(x -> x == null)) { ... }

Y de manera análoga para anyMatch y noneMatch .

Acerca de su "ejemplo más desafiante": en este caso, creo que no hay forma de evitar la escritura de una conjunción de verificación nula de nulos, como la que tiene:

if (a != null && a.getFoo() != null && a.getFoo().getBar() != null) { ... }

Cualquiera de los otros enfoques, utilizando secuencias, listas o métodos var-arg, intentaría evaluar a.getFoo() antes de que se haya probado que no es null . Podría usar Optional con punteros de map y método, que se evaluarán de forma perezosa uno después del otro, pero si esto lo hace más legible es discutible y puede variar de un caso a otro (particularmente para nombres de clase más largos):

if (Optional.ofNullable(a).map(A::getFoo).map(B::getBar).isPresent()) { ... } Bar bar = Optional.ofNullable(a).map(A::getFoo).map(B::getBar).orElse(null);

Otra alternativa podría ser try de acceder al elemento más interno, pero tengo la sensación de que esto tampoco se considera una buena práctica:

try { Bar bar = a.getFoo().getBar(); ... catch (NullPointerException e) { ... }

Particularmente, esto también capturará cualquier otro NPE después de acceder a ese elemento - o eso, o solo debe poner la Bar bar = ... en el try y todo lo demás en otro if bloque después del try anula cualquiera (cuestionable) ganancias en legibilidad o brevedad.

(Recuerdo vagamente algo acerca de una notación como a?.getFoo()?.getBar() != null , pero no recuerdo si fue una solicitud de función para Java o un lenguaje completamente diferente).

A menudo, puedo ver un código como el siguiente:

if(a == null || b == null || c == null){ //... }

Me pregunto si hay alguna biblioteca ampliamente utilizada (Google, Apache, etc.) para verificar la nulidad de varios objetos a la vez, por ejemplo:

if(anyIsNull(a, b, c)){ //... }

o

if(allAreNulls(a, b, c)){ //... }

ACTUALIZAR:

  1. Sé perfectamente cómo escribirlo yo mismo
  2. Sé que puede ser el resultado de la estructura deficiente del programa, pero no es un caso aquí
  3. Hagamos que sea más desafiante y reemplace el ejemplo original con algo como esto:

    if(a != null && a.getFoo() != null && a.getFoo().getBar() != null){ //... }

ACTUALIZACIÓN 2:

Creé una solicitud de extracción de la biblioteca Apache Commons Lang para solucionar este problema:

Estos serán incorporados en commons-lang, versión 3.5:

  • anyNotNull (Object... values)
  • allNotNull (Object... values)

Es posible con la ayuda de la clase Objects

public static void requireNonNull(Object... objects) { for (Object object : objects) { Objects.requireNonNull(object); } }


Puede crear una lista de sus objetos y usar yourList.contains(null) en ella.

List < Object > obList = new ArrayList < Object > (); String a = null; Integer b = 2; Character c = ''9''; obList.add(a); obList.add(b); obList.add(c); System.out.println("List is " + obList); if (obList.contains(null)) { System.out.println("contains null"); } else { System.out.println("does not contains null"); }

DEMO


También podría usar algo como el siguiente método. Le permite pasar tantos parámetros como desee:

public static boolean isAnyObjectNull(Object... objects) { for (Object o: objects) { if (o == null) { return true; } } return false; }

Lo llamas con tantos parámetros como quieras:

isAnyObjectNull(a, b, c, d, e, f);

Podría hacer algo similar para areAllNull .

public static boolean areAllObjectsNull(Object... objects) { for (Object o: objects) { if (o != null) { return false; } } return true; }

Nota : también puede usar el operador ternario en lugar de if (o == null) . Los dos métodos que se muestran aquí no tienen ningún error de manejo. Ajústelo a sus necesidades.