Java 如何利用带有optionals的lambda表达式

Java 如何利用带有optionals的lambda表达式,java,lambda,refactoring,guava,optional,Java,Lambda,Refactoring,Guava,Optional,我试图找到一种干净且代码高效的方法来应用guava中的transform方法(可选)来创建一个对象,我正在使用Java8和guava 在代码的一个地方,我创建了一个可选的。 Optional=Optional.of(objFromDatabase) 在另一个方面,我尝试用这个可选的创建一个新对象。我能想到的最好的事情就是 if (optional.isPresent()) { Object obj = optional.get(); NewObject n

我试图找到一种干净且代码高效的方法来应用guava中的transform方法(可选)来创建一个对象,我正在使用Java8和guava

在代码的一个地方,我创建了一个可选的。
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表达式


有什么好主意吗?

oresletrow
方法,可与可选选项一起使用。试试这个:

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

有使用with Optional的
oresletrow
方法。试试这个:

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

如果可能的话,试着在你的代码库中去掉番石榴的可选成分。 它们是在甲骨文的可选版本之前设计的。在这种情况下,将更容易使用流API。
把两者混在一起是不好的做法

如果可能的话,试着在你的代码库中去掉番石榴的可选成分。 它们是在甲骨文的可选版本之前设计的。在这种情况下,将更容易使用流API。
把两者混在一起是不好的做法

如果您确实不想将番石榴
可选
替换为JDK的
可选
(但您应该这样做),您可以使用helper方法并对其API进行操作:

guavaOptional.toJavaUtil()
    .map(obj -> obj.createNewObj())
    .orElseThrow(IOException::new);
编辑:
如果您的
createNewObj()
方法抛出checked异常(此处:
IOException
),您显然无法在lambda表达式中输入未经检查的异常,而不首先将其包装为未经检查的异常(例如)。

如果您确实不想将番石榴
Optional
替换为JDK的
Optional
(但您应该),您可以使用helper方法并对其API进行操作:

guavaOptional.toJavaUtil()
    .map(obj -> obj.createNewObj())
    .orElseThrow(IOException::new);
编辑:
如果您的
createNewObj()
方法抛出checked异常(此处:
IOException
),您显然无法在lambda表达式中输入未经检查的异常(例如)。没有人真正给出代码答案,所以这里有一个

首先,创建一个映射对象并处理选中异常的方法(将其包装为未选中异常)

然后,只需执行法线映射:

NewObject newObject = Optional.of(objFromDatabase).toJavaUtil()
  .map(this::uncheckedCreateNewObject)
  .orElseThrow(IOException::new);

没有人真正给出密码答案,所以这里有一个

首先,创建一个映射对象并处理选中异常的方法(将其包装为未选中异常)

然后,只需执行法线映射:

NewObject newObject = Optional.of(objFromDatabase).toJavaUtil()
  .map(this::uncheckedCreateNewObject)
  .orElseThrow(IOException::new);

->
,而不是
=>
.map(o->o.createNewObj())
不会编译,因为
obj.createNewObj()//抛出IOException
。我正在设法返回newObj对象。抱歉,如果在OP中不清楚,将进行编辑以反映这一点。感谢@AndyTurner和Antot的通知。我的答案可能不满足问题
->
,而不是
=>
.map(o->o.createNewObj())
不会编译,因为
obj.createNewObj()//抛出IOException
。我正在设法返回newObj对象。抱歉,如果在OP中不清楚,将进行编辑以反映这一点。感谢@AndyTurner和Antot的通知。我的答案可能无法满足这个问题,在我的代码中,我一直在使用Guava的optional,因此替换它将非常耗时。@Zaryab最好现在就动手,而不是拖延;随着时间的推移,切换所需的工作量只会越来越大(#technicaldebt)。此时,我在整个代码中都在使用Guava的可选项,因此替换它将非常耗时。@Zaryab最好现在就接受挑战,而不是延迟它;随着时间的推移,切换所需的工作量只会越来越大。