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:
cars.stream()
.filter(Objects::nonNull)
O que limpará seus objetos nulos. Para quem não conhece, essa é a abreviação para o seguinte:
cars.stream()
.filter(car -> Objects.nonNull(car))
Para responder parcialmente à pergunta em questão e retornar a lista de nomes de carros que começa com "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());
Depois de se acostumar com as lambdas de taquigrafia, você também pode fazer isso:
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());
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:
cars.stream()
.filter(car -> Objects.nonNull(car))
.filter(car -> Objects.nonNull(car.getName()))
.filter(car -> car.getName().startsWith("M"))
.collect(Collectors.toList());