У меня есть список объектов, скажем car
. Я хочу отфильтровать этот список на основе какого-либо параметра, используя Java 8. Но если параметр есть null
, он выбрасывает NullPointerException
. Как отфильтровать нулевые значения?
Текущий код выглядит следующим образом
requiredCars = cars.stream().filter(c -> c.getName().startsWith("M"));
Это бросает, NullPointerException
если getName()
возвращается null
.
Ответы:
В этом конкретном примере я думаю, что @Tagir на 100% корректен, поместите его в один фильтр и выполните две проверки. Я бы не стал использовать
Optional.ofNullable
Optional, чтобы возвращаемые типы не делали логику ... но на самом деле ни здесь, ни там.Я хотел бы отметить, что для этого
java.util.Objects
есть хороший метод в широком случае, так что вы можете сделать это:Который очистит ваши нулевые объекты. Для тех, кто не знаком, это сокращение для следующего:
Чтобы частично ответить на поставленный вопрос, вернем список имен автомобилей, который начинается с
"M"
:Как только вы привыкнете к сокращенной лямбде, вы также можете сделать это:
К сожалению, однажды вы
.map(Car::getName)
вернете список имен, а не автомобили. Так менее красиво, но полностью отвечает на вопрос:источник
Objects::nonNull
не может быть использован здесь, и в последнем совете это должно быть,cars.stream() .filter(car -> Objects.nonNull(car.getName()))
я верюcars.stream() .filter(car -> Objects.nonNull(car.getName()) && car.getName().startsWith("M"))
что будет краткое изложение вашего совета в этом вопросе контекста.startWith
может также привести к нулевому указателю. Я пытался подчеркнуть, что Java предоставляет метод, специально предназначенный для фильтрации пустых объектов из ваших потоков.Objects.nonNull
, эквивалентен!= null
, ваш вариант корочеString
) вместо автомобилей (Car
)?Вам просто нужно отфильтровать автомобили, которые имеют
null
имя:источник
Предлагаемые ответы великолепны. Просто хотел бы предложить улучшение для обработки случая использования нулевого списка
Optional.ofNullable
, новая функция в Java 8 :Итак, полный ответ будет:
источник
Objects::nonNull
что не решает проблему, поскольку ненулевой автомобиль может иметь имя == nullВы можете сделать это за один шаг фильтра:
Если вы не хотите звонить
getName()
несколько раз (например, это дорогой звонок), вы можете сделать это:Или более изощренным способом:
источник
Используя силу
java.util.Optional#map()
:источник
Вы можете использовать это
источник