Les valeurs de filtre à condition de ne pas null à l'aide de lambda dans Java8
J'ai une liste d'objets de dire car
. Je veux filtrer cette liste en fonction de certains paramètres à l'aide de Java 8. Mais si le paramètre est null
, il jette NullPointerException
. Comment filtrer les valeurs null?
Actuel code est comme suit
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Ce lève NullPointerException
si getName()
retourne null
.
- Voulez-vous “des valeurs de filtre à condition de ne pas null” ou “filtrer les valeurs null”? Que les sons se contredire pour moi.
- Pourrais-je suggérer que vous acceptez Tunaki réponse comme il semble être le seul qui, de fait, les réponses à votre question.
Vous devez vous connecter pour publier un commentaire.
Dans cet exemple particulier, je pense que @Tagir est correct à 100% de l'obtenir dans un filtre et de faire les deux contrôles. Je ne voudrais pas utiliser
Optional.ofNullable
l'Option stuff est vraiment pour les types de retour de ne pas faire de la logique... mais vraiment ni ici, ni là.Je tenais à préciser que
java.util.Objects
a une belle méthode pour cela dans une vaste affaire, de sorte que vous pouvez le faire:Qui va effacer vos objets nuls. Pour quiconque n'est pas familier, c'est le court-main pour les éléments suivants:
Pour répondre partiellement à la question à portée de main pour retourner la liste des noms de voiture qui démarre avec
"M"
:Une fois que vous vous habituez à l'abréviation lambdas vous pourriez aussi le faire:
Malheureusement, une fois que vous
.map(Car::getName)
vous n'aurez qu'à retourner à la liste des noms, pas les voitures. Donc, moins beau mais répond pleinement à la question:Objects::nonNull
ne peut pas être utilisé ici, et dans les derniers conseils, il devrait êtrecars.stream() .filter(car -> Objects.nonNull(car.getName()))
je croiscars.stream() .filter(car -> Objects.nonNull(car.getName()) && car.getName().startsWith("M"))
serait le résumé de vos conseils dans cette question de contexte.startWith
pourrait aussi provoquer un pointeur null. Le point que j'essayais de faire, c'est que Java fournit une méthode spécialement pour filtrer les objets nuls à partir de votre flux.Objects.nonNull
est équivalent à!= null
, votre option est plus courteString
) au lieu des voitures (Car
)?getName
c'est juste une liste de Chaînes de caractères. Je vais mettre à jour la réponse. Merci!!!!Vous avez juste besoin de filtrer les voitures qui ont une
null
nom:Les réponses proposées sont grands. Juste aimerais suggérer une amélioration à gérer le cas de null liste à l'aide de
Optional.ofNullable
, nouvelle fonctionnalité de Java 8:Donc, la réponse sera:
Objects::nonNull
ne résout pas le problème puisque les non-nulle de la voiture peut avoir nom==nullVous pouvez le faire en une seul étape de filtre:
Si vous ne souhaitez pas appeler
getName()
plusieurs fois (par exemple, il est cher à l'appel), vous pouvez le faire:Ou plus complexes: