java == null vs Objects.isNull es una pregunta bastante habitual a partir de Java 8 . Todos estamos bastante acostumbrados a comprobar si un objeto es nulo con el operador == o con el operador != . Java 8 añade una opción adicional que nos permite comprobar si un objeto es null con la clase de utilidad Objects.isNull. En un primer momento nos puede parecer extraño y no entendemos el porqué de su uso pero tiene su razón de ser . Vamos a verlo con un ejemplo sencillo y una lista de Personas de las cuales imprimimos su nombre en el caso de que el objeto no sea nulo.
package com.arquitecturajava;
public class Persona {
private String nombre;
public Persona(String nombre) {
super();
this.nombre = nombre;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Filtrando Personas
La clase Persona únicamente incluye el nombre . Es momento de generar una lista que incluya valores nulos para varios objetos Persona y recorrerla para eliminar estas situaciones apoyándonos con el operador != en cuando a valores null se refiere.
Veamos el código:
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
public class Principal {
public static void main(String[] args) {
List<Persona> lista= new ArrayList<Persona>();
lista.add(new Persona("juan"));
lista.add(new Persona("ana"));
lista.add(new Persona("gema"));
lista.add(null);
lista.add(new Persona("blanca"));
lista.add(null);
lista.add(new Persona("david"));
for (Persona p:lista) {
if (p!=null) {
System.out.println(p.getNombre());
}
}
}
} En este caso el código es sencillo y el resultado por la consola el esperado:
Simplemente hemos usado un bucle for con una sentencia if para filtrar.
java == null vs Objects.isNull
¿Podemos realizar otro enfoque con Java 8? . La realidad es que sí , pero el código es muy similar al anterior y utilizaríamos la clase de utilidad Objects.
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Principal2 {
public static void main(String[] args) {
List<Persona> lista= new ArrayList<Persona>();
lista.add(new Persona("juan"));
lista.add(new Persona("ana"));
lista.add(new Persona("gema"));
lista.add(null);
lista.add(new Persona("blanca"));
lista.add(null);
lista.add(new Persona("david"));
for (Persona p:lista) {
if (Objects.nonNull(p)) {
System.out.println(p.getNombre());
}
}
}
}
A todo el mundo le suele parecer un sin sentido la nueva versión del código ya que es prácticamente idéntica a la anterior y el resultado no varía.
¿Hemos ganado algo con la nueva versión ?, la realidad es que no lo parece. ¿Entonces porque la inclusión de esta nueva funcionalidad a nivel de Java 8 ¿Qué sentido tiene?. Esta funcionalidad aporta valor cuando trabajamos con programación funcional y Streams y queremos eliminar de una lista los valores nulos.
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Principal3 {
public static void main(String[] args) {
List<Persona> lista= new ArrayList<Persona>();
lista.add(new Persona("juan"));
lista.add(new Persona("ana"));
lista.add(new Persona("gema"));
lista.add(null);
lista.add(new Persona("blanca"));
lista.add(null);
lista.add(new Persona("david"));
lista.stream()
.filter(Objects::nonNull)
.map(Persona::getNombre)
.forEach(System.out::println);
}
}
Como se puede observar nos apoyamos en un método de referencia y apuntamos al método que se encuentra en la clase Objects a nivel de utilidades. De esta manera habremos conseguido realizar el mismo filtrado de una forma más elegante usando programación funcional y apoyándonos en el método Objects.nonNull.