如何在可选项存在时返回,如果不存在则继续执行?

12

我有一个可选的方法,它返回一个Cat对象(也是可选的)。在调用它的地方,我想以一种方式处理它:如果有猫就返回,否则继续执行。

Opitional<Cat> option = isCatFound();
if (option.isPresent()) {
return option.get();
}
//DO STUFF HERE IF NO CAT FOUND

我现在有上述的代码。我希望使用更好的东西来代替它,一个单行解决方案。

是否有这样的可能性?或者正确的使用 Optional 的方式?


这个有用吗?"expression?condition1:condition2" - JavaLearner
否则继续做什么? - Konstantin Yovkov
3个回答

12

由于你的方法必须在结尾返回该类型的值,因此你可以使用

Optional<Cat> option = isCatFound();
return option.orElseGet(() -> {
  // DO STUFF HERE IF NO CAT FOUND
  // WHICH WILL EVENTUALLY RETURN A VALUE
};
如果你的“stuff if no cat found”能放在一行里,那可能是个选择。否则我不认为它比你原来的代码有什么优势。特别是因为这种替代代码路径不能再抛出已检查异常的缺点。

10

Optional类提供了一个方法来实现这个目的:orElseGet(Supplier)。因此,通过一些小的帮助方法,您可以这样做:

Optional<Cat> option = isCatFound();
return option.orElseGet(this::noCatFound);

private Cat noCatFound() {
    // do whatever is appropriate here
    return null;
}

当然,你可以将帮助方法的主体移入一个 lambda 表达式,该表达式提供 orElseGet 方法。


3

首先,我会更改isCatFound()的名称。良好的模式是仅使用可以用“yes”或“no”回答的函数名称,用于返回boolean的函数。例如,您的isCatFound方法应该返回truefalse,这将意味着找到或未找到猫。如果它返回Optional<Cat>,我会将其命名为getCat()

接下来,您可以利用OptionalorElseGet(Supplier<? extends T>)成员。如果值存在,它会返回该值,否则会调用Supplier。对于您的示例,代码如下:

return getCat().orElseGet(() -> {
    //Whatever you want to do
    //return result
});

请注意,上面的示例非常易于阅读和理解。它告诉您确切地它所做的事情:获取猫或获取 lambda 返回的任何其他内容
如果您不熟悉 Lambda,请查看此文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接