J'ai une liste d'objets à dire car
. Je veux filtrer cette liste en fonction d'un paramètre en utilisant Java 8. Mais si le paramètre est null
, il jette NullPointerException
. Comment filtrer les valeurs nulles?
Le code actuel est le suivant
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Cela jette NullPointerException
si getName()
revient null
.
Réponses:
Dans cet exemple particulier, je pense que @Tagir est correct à 100%, mettez-le dans un filtre et effectuez les deux vérifications. Je n'utiliserais pas
Optional.ofNullable
le truc optionnel, c'est vraiment pour les types de retour de ne pas faire de logique ... mais vraiment ni ici ni là-bas.Je voulais souligner qu'il
java.util.Objects
existe une méthode intéressante pour cela dans un cas large, vous pouvez donc le faire:Ce qui effacera vos objets nuls. Pour ceux qui ne sont pas familiers, c'est le raccourci pour ce qui suit:
Pour répondre partiellement à la question posée, renvoyez la liste des noms de voitures commençant par
"M"
:Une fois que vous vous êtes habitué aux lambdas abrégés, vous pouvez également le faire:
Malheureusement, une fois que vous
.map(Car::getName)
êtes, vous ne retournerez que la liste des noms, pas les voitures. Donc moins beau mais répond pleinement à la question:la source
Objects::nonNull
ne peut pas être utilisé ici, et dans le dernier conseil, cela devrait être,cars.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 ce contexte de question.startWith
pourrait également provoquer un pointeur nul. Le point que j'essayais de souligner est que Java fournit une méthode spécifiquement pour filtrer les objets nuls de vos flux.Objects.nonNull
équivalent à!= null
, votre option est plus courteString
) à la place de voitures (Car
)?Il vous suffit de filtrer les voitures qui ont un
null
nom:la source
Les réponses proposées sont excellentes. Voudrais simplement suggérer une amélioration de traiter le cas de la liste null en utilisant
Optional.ofNullable
, nouvelle fonctionnalité en Java 8 :Donc, la réponse complète sera:
la source
Objects::nonNull
ne résout donc pas le problème car une voiture non nulle peut avoir le nom == nullVous pouvez le faire en une seule étape de filtrage:
Si vous ne souhaitez pas appeler
getName()
plusieurs fois (par exemple, c'est un appel coûteux), vous pouvez le faire:Ou de manière plus sophistiquée:
la source
Tirer parti de la puissance de
java.util.Optional#map()
:la source
vous pouvez utiliser ceci
la source