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:
cars.stream()
.filter(Objects::nonNull)
Ce qui effacera vos objets nuls. Pour ceux qui ne sont pas familiers, c'est le raccourci pour ce qui suit:
cars.stream()
.filter(car -> Objects.nonNull(car))
Pour répondre partiellement à la question posée, renvoyez la liste des noms de voitures commençant par "M"
:
cars.stream()
.filter(car -> Objects.nonNull(car))
.map(car -> car.getName())
.filter(carName -> Objects.nonNull(carName))
.filter(carName -> carName.startsWith("M"))
.collect(Collectors.toList());
Une fois que vous vous êtes habitué aux lambdas abrégés, vous pouvez également le faire:
cars.stream()
.filter(Objects::nonNull)
.map(Car::getName) // Assume the class name for car is Car
.filter(Objects::nonNull)
.filter(carName -> carName.startsWith("M"))
.collect(Collectors.toList());
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:
cars.stream()
.filter(car -> Objects.nonNull(car))
.filter(car -> Objects.nonNull(car.getName()))
.filter(car -> car.getName().startsWith("M"))
.collect(Collectors.toList());