Tengo una lista de objetos que decir car
. Quiero filtrar esta lista basada en algún parámetro usando Java 8. Pero si el parámetro es null
, arroja NullPointerException
. ¿Cómo filtrar valores nulos?
El código actual es el siguiente
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Esto arroja NullPointerException
si getName()
regresa null
.
Respuestas:
En este ejemplo en particular, creo que @Tagir es 100% correcto, mételo en un filtro y realiza las dos comprobaciones. No usaria
Optional.ofNullable
las cosas opcionales para que los tipos de retorno no estén haciendo lógica ... pero realmente ni aquí ni allá.Quería señalar que
java.util.Objects
tiene un buen método para esto en un caso amplio, por lo que puede hacer esto:Lo que limpiará tus objetos nulos. Para cualquiera que no esté familiarizado, esa es la abreviatura de lo siguiente:
Para responder parcialmente la pregunta en cuestión y devolver la lista de nombres de automóviles que comienza con
"M"
:Una vez que te acostumbres a las taquillas lambdas, también puedes hacer esto:
Desafortunadamente, una vez
.map(Car::getName)
que solo regreses la lista de nombres, no los autos. Por lo tanto, menos hermoso pero responde completamente la pregunta:fuente
Objects::nonNull
no se puede usar aquí, y en el último consejo debería sercars.stream() .filter(car -> Objects.nonNull(car.getName()))
yo creocars.stream() .filter(car -> Objects.nonNull(car.getName()) && car.getName().startsWith("M"))
que sería el resumen de su consejo en este contexto de pregunta.startWith
también podría causar un puntero nulo. El punto que estaba tratando de hacer es que Java proporciona un método específicamente para filtrar objetos nulos de sus secuencias.Objects.nonNull
es equivalente a!= null
, su opción es más cortaString
) en lugar de autos (Car
)?Solo necesita filtrar los autos que tienen un
null
nombre:fuente
Las respuestas propuestas son geniales. Sólo quisiera sugerir una mejora para manejar el caso de la lista nula usando
Optional.ofNullable
, nueva característica en Java 8 :Entonces, la respuesta completa será:
fuente
Objects::nonNull
lo tanto , no resuelve el problema ya que el automóvil no nulo puede tener nombre == nuloPuede hacer esto en un solo paso de filtro:
Si no desea llamar
getName()
varias veces (por ejemplo, es una llamada costosa), puede hacer esto:O de manera más sofisticada:
fuente
Aprovechando el poder de
java.util.Optional#map()
:fuente
puedes usar esto
fuente