Я пытаюсь заменить существующий цикл лямбда-выражениями Java.
У меня есть простая структура данных, которая выглядит следующим образом:
class DbObject{
private Long objectId;
private Long basedOnObjectId; //<- this field can be null
public Long getObjectId() {
return objectId;
}
public void setObjectId(Long objectId) {
this.objectId = objectId;
}
public Long getBasedOnObjectId() {
return basedOnObjectId;
}
public void setBasedOnObjectId(Long basedOnObjectId) {
this.basedOnObjectId = basedOnObjectId;
}
}
Затем у меня есть список DbObjects
И я пытаюсь отфильтровать каждый DbObject с указанным на основеOnObjectId:
(1) list.stream().filter(object -> obejct.getBasedOnObjectId()
.equals(basedOnObject.getObjectId()))
.collect(Collector.of(List))
Конечно, этот код дает мне NullPointer, потому что некоторые od DbObject не имеют BasedOnObjectId, потому что они являются корнями.
Поэтому естественно заменить поле «Long basedOnObjectId;» по желанию, но, как я уже упоминал в начале, существует существующий производственный код, потому что это не быстрое решение.
Итак, я пытаюсь внести некоторые изменения, я оцениваю следующее предложение:
Optional<Long> option = Optional.ofNullable(objectWithNullBasedOnId.getBasedOnObjectId());
И попробуйте с методом .get() или .ifPresent(), но .get() также выдает исключение нулевого указателя, а ifPresent не предназначен для работы с потоком.
Я заметил это и тот факт, что когда у меня есть DbObject с нулем на основеOnObjectId, мне не нужно проверять, является ли значение точно нулевым, а только пропустить этот шаг выполнения.
Поэтому я решил использовать метод .orElse() и вернуть какое-то поддельное значение. В этом случае я возвращаю значение 0L, потому что этого индекса нет в БД :)
Итак, мой код:
(2) List newList = list.stream().filter(object -> Optional.ofNullable(object.getBasedOnObjectId())
.orElse(0L)
.equals(basedOnObject.getObjectId()) )
.collect(Collectors.toList()) ;
И это работает правильно в этом случае, но я думаю, что это какой-то обходной путь. В других языках можно пропустить выполнение с нулевым значением или использовать методы типа skip-skipWhen.
Мой вопрос: если существует возможность достичь цели выражения (2) с использованием специального метода (в примере, необязательного) из java 8 и написать «в стиле потока» :)