如果存在可选项,如何返回,如果不存在则继续

时间:2015-08-31 12:28:28

标签: java java-8

我有一个可选的方法,它返回Cat个对象(这是一个可选的)。从我称之为It的地方,我想以if cat is present then return otherwise continue

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

以上代码就是我现在所拥有的。我喜欢使用比这更好的东西,单线解决方案。

有可能吗?或者正确使用可选方式?

3 个答案:

答案 0 :(得分:9)

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

Optional<Cat> option = isCatFound();
return option.orElseGet(() -> {
  // DO STUFF HERE IF NO CAT FOUND
  // WHICH WILL EVENTUALLY RETURN A VALUE
};

如果您的“找不到猫的东西”适合单行,则可能是一种选择。 否则,我认为原始代码没有任何优势。特别是因为它的缺点是替代代码路径不能再抛出已检查的异常。

答案 1 :(得分:9)

Optional类为此提供了一种方法:orElseGet(Supplier)。所以,使用一些小助手方法就可以做到这一点:

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

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

当然,您可以将辅助方法的主体移动到lambda exprssion中,该方法为orElseGet方法提供信息。

答案 2 :(得分:1)

首先,我要更改isCatFound()的名称。好的模式是使用函数的名称,只有返回boolean的函数才能回答“是”或“否”。例如,您的isCatFound方法应该返回truefalse,这意味着找到了猫。如果它返回Optional<Cat>,我只会将其命名为getCat()

然后,您可以利用orElseGet(Supplier<? extends T>)的{​​{1}}成员。如果它存在则返回值,否则返回Optional。对于您的示例,它可能如下所示:

Supplier

请注意,在上面的示例中,您可以轻松阅读“理解代码”。它会准确地告诉您它的作用:return getCat().orElseGet(() -> { //Whatever you want to do //return result });

如果您不熟悉Lambdas,请查看以下文章:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html