如何利用带有选项的lambda表达式

时间:2018-03-12 10:38:25

标签: java lambda refactoring guava optional

我正在尝试找到一种干净且代码有效的方法来在guava中应用transform方法以创建一个对象,我正在使用带有Guava的Java 8。

在代码的一个地方,我有一个可选的创建。 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() }

但这很麻烦,我希望学习更多关于optionals和lambda表达式的知识。

那里有什么好主意吗?

4 个答案:

答案 0 :(得分:3)

没有人真正给出了代码答案,所以这是一个。

首先,创建一个映射对象并处理已检查异常的方法(通过将其包装在未经检查的异常中)。

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);

答案 1 :(得分:1)

如果可能,请尝试摆脱代码库中Guava的Optional`s。 它们是在Oracle的Optional之前设计的。在这种情况下,将更容易使用Stream API。 混合它们是不好的做法。

答案 2 :(得分:1)

如果你真的不想将Guava Optional交换到JDK&#39; Optional(但你应该),你可以使用帮助toJavaUtil()方法进行操作它的API:

guavaOptional.toJavaUtil()
    .map(obj -> obj.createNewObj())
    .orElseThrow(IOException::new);

修改 如果您的createNewObj()方法抛出已检查异常(此处为:IOException),您显然无法放入lambda表达式而不首先使用未经检查的异常包装它(例如。{{3} })。

答案 3 :(得分:0)

使用带有Optional的orEsleThrow方法。试试这个:

NewObject obj = Optional.ofNullable(objFromDatabase)
  .map(o -> o.createNewObj())
  .orElseThrow(IOException::new)