In questo esempio particolare penso che @Tagir sia corretto al 100%, inseriscilo in un filtro e fai i due controlli. Non Optional.ofNullable
userei le cose opzionali è davvero per i tipi di restituzione di non fare la logica ... ma davvero né qui né lì.
Volevo sottolineare che java.util.Objects
ha un buon metodo per questo in un caso ampio, quindi puoi farlo:
cars.stream()
.filter(Objects::nonNull)
Che cancellerà i tuoi oggetti null. Per chiunque non abbia familiarità, questa è la scorciatoia per quanto segue:
cars.stream()
.filter(car -> Objects.nonNull(car))
Per rispondere parzialmente alla domanda a portata di mano per restituire l'elenco dei nomi di auto che inizia con "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());
Una volta che ti sei abituato alla stenografia lambdas puoi anche fare questo:
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());
Sfortunatamente, una volta che .map(Car::getName)
hai restituito solo l'elenco dei nomi, non le macchine. Quindi meno bello ma risponde pienamente alla domanda:
cars.stream()
.filter(car -> Objects.nonNull(car))
.filter(car -> Objects.nonNull(car.getName()))
.filter(car -> car.getName().startsWith("M"))
.collect(Collectors.toList());