Eu tenho uma lista de objetos dizem car
. Eu quero filtrar esta lista com base em algum parâmetro usando Java 8. Mas se o parâmetro for null
, ele lança NullPointerException
. Como filtrar valores nulos?
O código atual é o seguinte
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Isso joga NullPointerException
se getName()
retorna null
.
Respostas:
Neste exemplo em particular, acho que o @Tagir está 100% correto, coloque-o em um filtro e faça as duas verificações. Eu não usaria
Optional.ofNullable
o material opcional é realmente para os tipos de retorno não estarem fazendo lógica ... mas realmente nem aqui nem ali.Queria ressaltar que
java.util.Objects
existe um método legal para isso em um caso amplo, para que você possa fazer isso:O que limpará seus objetos nulos. Para quem não conhece, essa é a abreviação para o seguinte:
Para responder parcialmente à pergunta em questão e retornar a lista de nomes de carros que começa com
"M"
:Depois de se acostumar com as lambdas de taquigrafia, você também pode fazer isso:
Infelizmente, uma vez que
.map(Car::getName)
você retornará apenas a lista de nomes, não os carros. Tão menos bonita, mas responde totalmente à pergunta:fonte
Objects::nonNull
não pode ser usada aqui, e no último conselho que deveria sercars.stream() .filter(car -> Objects.nonNull(car.getName()))
eu acreditocars.stream() .filter(car -> Objects.nonNull(car.getName()) && car.getName().startsWith("M"))
seria o resumo do seu conselho neste contexto questão.startWith
também pode causar um ponteiro nulo. O ponto que eu estava tentando destacar é que o Java fornece um método especificamente para filtrar objetos nulos de seus fluxos.Objects.nonNull
é equivalente a!= null
, sua opção é mais curtosString
) em vez de carros (Car
)?Você só precisa filtrar os carros que têm um
null
nome:fonte
As respostas propostas são ótimas. Gostaria apenas de sugerir uma melhoria para lidar com o caso da lista nula usando
Optional.ofNullable
, novo recurso no Java 8 :Portanto, a resposta completa será:
fonte
Objects::nonNull
, não resolve o problema, já que o carro não nulo pode ter o nome == nullVocê pode fazer isso na etapa de filtro único:
Se você não quiser ligar
getName()
várias vezes (por exemplo, é uma ligação cara), faça o seguinte:Ou de maneira mais sofisticada:
fonte
Aproveitando o poder de
java.util.Optional#map()
:fonte
você pode usar isso
fonte