В этом конкретном примере я думаю, что @Tagir на 100% корректен, поместите его в один фильтр и выполните две проверки. Я бы не стал использовать Optional.ofNullable
Optional, чтобы возвращаемые типы не делали логику ... но на самом деле ни здесь, ни там.
Я хотел бы отметить, что для этого java.util.Objects
есть хороший метод в широком случае, так что вы можете сделать это:
cars.stream()
.filter(Objects::nonNull)
Который очистит ваши нулевые объекты. Для тех, кто не знаком, это сокращение для следующего:
cars.stream()
.filter(car -> Objects.nonNull(car))
Чтобы частично ответить на поставленный вопрос, вернем список имен автомобилей, который начинается с "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());
Как только вы привыкнете к сокращенной лямбде, вы также можете сделать это:
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());
К сожалению, однажды вы .map(Car::getName)
вернете список имен, а не автомобили. Так менее красиво, но полностью отвечает на вопрос:
cars.stream()
.filter(car -> Objects.nonNull(car))
.filter(car -> Objects.nonNull(car.getName()))
.filter(car -> car.getName().startsWith("M"))
.collect(Collectors.toList());