W tym konkretnym przykładzie myślę, że @Tagir jest w 100% poprawny, włóż go do jednego filtra i wykonaj dwie kontrole. Nie użyłbym Optional.ofNullable
opcjonalnych rzeczy, które są naprawdę dla typów zwracanych, aby nie wykonywać logiki ... ale tak naprawdę ani tu, ani tam.
Chciałem zaznaczyć, że java.util.Objects
ma na to fajną metodę w szerokim przypadku, więc możesz to zrobić:
cars.stream()
.filter(Objects::nonNull)
Który usunie twoje puste obiekty. Dla każdego, kto nie jest zaznajomiony, jest to krótka ręka na:
cars.stream()
.filter(car -> Objects.nonNull(car))
Aby częściowo odpowiedzieć na zadane pytanie, należy zwrócić listę nazw samochodów zaczynającą się od "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());
Gdy już przyzwyczaisz się do skróconych lambd, możesz również zrobić to:
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());
Niestety, raz .map(Car::getName)
zwrócisz tylko listę nazwisk, a nie samochody. Tak mniej piękna, ale w pełni odpowiada na pytanie:
cars.stream()
.filter(car -> Objects.nonNull(car))
.filter(car -> Objects.nonNull(car.getName()))
.filter(car -> car.getName().startsWith("M"))
.collect(Collectors.toList());