JDK8 лямбда NullPointerException на карте фильтра - PullRequest
0 голосов
/ 27 мая 2018

У меня есть эта забавная функция, пытающаяся играть с JDK8.Он возвращает из списка значений после процедуры фильтрации значения для одноуровневого списка значение параметра.

Очевидно, как коллекция, где мне нужно значение.Так как это отображение один в один, это будет первый элемент массива.

В результате он разрывается с печально известным NullPointerException.Пока я знаю, что хотя бы list1 не пусто.Если я поставлю галочку на house.getParkingInfo(), то почему бы не использовать старый стиль моды простых if -классов, чтобы написать то же самое?

Есть ли стиль / руководство / трюк, чтобы избежать этого NullPointerExceptionи убедитесь, что он выполнит каждую часть лямбды тогда и только тогда, когда содержит действительные данные?

return listOfPossibleHaircuts.stream().filter(p->p.getParameterDetailId().intValue()==object.getInfo().get("HAIR_STYLE").intValue() ).map(ParameterDetail::getParameterValue).collect(Collectors.toList()).get(0);

1 Ответ

0 голосов
/ 27 мая 2018

Глядя на ваш конвейер:

return listOfPossibleHaircuts.stream().filter(p->p.getParameterDetailId().intValue()==object.getInfo().get("HAIR_STYLE").intValue() ).map(ParameterDetail::getParameterValue).collect(Collectors.toList()).get(0);

Чтобы избежать исключений, вы должны убедиться, что:

  1. p.getParameterDetailId() не равно нулю
  2. getParameterValueне возвращает ноль
  3. Список, возвращаемый этим конвейером, не является пустым

Я предлагаю:

return listOfPossibleHaircuts.stream()
                             .filter(p->p.getParameterDetailId() != null)
                             .filter(p->p.getParameterDetailId().equals(object.getInfo().get("HAIR_STYLE")))
                             .map(ParameterDetail::getParameterValue)
                             .filter(Objects::nonNull)
                             .findFirst();

Это вернет Optional<TheTypeReturnedBygetParameterValue>.

Не стесняйтесь снимать любые ненужные чеки null (если getParameterDetailId или getParameterValue никогда не вернется null).

Вы также можете подключиться к findFirst().get(), если вы уверены, что List не будет пустым.

Мое решение предполагает, что object.getInfo().get("HAIR_STYLE") != null.Это можно проверить перед запуском конвейера Stream, и, как прокомментировал Хольгер, его можно использовать для упрощения фильтрации:

Object result = null;
Object style = object.getInfo().get("HAIR_STYLE");
if (style != null) {
    result = listOfPossibleHaircuts.stream()
                                   .filter(p->style.equals(p.getParameterDetailId()))
                                   .map(ParameterDetail::getParameterValue)
                                   .filter(Objects::nonNull)
                                   .findFirst()
                                   .orElse(null);
}
return result;

Я сделал еще одно небольшое предположение - конвейер Stream не долженбудет выполнено вообще, если object.getInfo().get("HAIR_STYLE") == null.

...