Как воспользоваться лямбда-выражением с опциями
Я пытаюсь найти чистый и эффективный код способ применения метода преобразования в guava необязательно для создания объекта, я работаю с Java 8 с Guava.
В одном месте кода я необязательно создал. Optional<Object> optional = Optional.of(objFromDatabase)
И в другой области я пытаюсь создать новый объект с этим необязательно. Лучшее, что я мог придумать, это
if (optional.isPresent()) {
Object obj = optional.get();
NewObject newObj = obj.createNewObj(); //throws IOException, newobj to be returned
} else { throw new IOException() }
Но это громоздко, и я надеюсь узнать немного больше об опциях и лямбда-выражениях.
Есть хорошие идеи там?
4 ответа
Никто не дал кодовый ответ, так что вот один.
Во-первых, создайте метод, который отображает объект и обрабатывает проверенное исключение (помещая его в непроверенное исключение).
private NewObject uncheckedCreateNewObject(Object o) {
try {
return o.createNewObject();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
Затем просто выполните нормальное отображение:
NewObject newObject = Optional.of(objFromDatabase).toJavaUtil()
.map(this::uncheckedCreateNewObject)
.orElseThrow(IOException::new);
Если вы действительно не хотите менять местами гуаву Optional
к JDK Optional
(но вы должны), вы можете использовать помощник toJavaUtil()
метод и оперируем его API:
guavaOptional.toJavaUtil()
.map(obj -> obj.createNewObj())
.orElseThrow(IOException::new);
РЕДАКТИРОВАТЬ: Если ваш createNewObj()
метод выдает проверенное исключение (здесь: IOException
), вы, очевидно, не сможете вставить в лямбда-выражение, не обернув его сначала непроверенным исключением (например, UncheckedIOExcpetion
).
Если это возможно, попытайтесь избавиться от необязательных Guava в вашей кодовой базе. Они были разработаны до Oracle. В этом случае будет проще использовать Stream API. Это плохая практика смешивать их обоих.
Есть orEsleThrow
Метод с использованием Необязательно. Попробуй это:
NewObject obj = Optional.ofNullable(objFromDatabase)
.map(o -> o.createNewObj())
.orElseThrow(IOException::new)