我有一个可选的方法,它返回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
以上代码就是我现在所拥有的。我喜欢使用比这更好的东西,单线解决方案。
有可能吗?或者正确使用可选方式?
答案 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
方法应该返回true
或false
,这意味着找到了猫。如果它返回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