Как воспользоваться лямбда-выражением с опциями

Я пытаюсь найти чистый и эффективный код способ применения метода преобразования в 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)
Другие вопросы по тегам