У цьому конкретному прикладі я вважаю, що @Tagir на 100% правильний, введіть його в один фільтр і зробіть дві перевірки. Я б не використовував Optional.ofNullable
Факультативні речі справді для того, щоб типи повернення не виконували логіку ... але насправді ні тут, ні там.
Я хотів би зазначити, що 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());