在发布时Java-11,当我们可以直接检查一个数字是否不为null或不等于特定数字时,为什么要orElseThrow与optionalLong/ OptionalDouble等Optional Types一起使用。
另外,我们正在做空检查,这比抛出异常更好吗?
可能是无法想象真正使用的optionalTypes和orElseThrow。
适用于的Javadoc orElseThrow。
当我们可以直接检查一个数字是否不为空或不等于特定数字时,为什么我们有 orElseThrow 和 optionLong /OptionalDouble 。
事实并非如此,Optionals 是为返回类型而设计的,而不是为了检查输入参数。在后面的情况下,检查非空或范围有效性(对于原语)更有意义。
此外,这些功能并不新鲜。Java 8 已经引入了这些功能。
为了说明 的兴趣,假设您从方法中搜索 id 但可能找不到该 id 的OptionalLong.orElseThrow()情况。
这是处理未找到值情况的代码。 long
如果没有OptionalLong,您应该选择任意长值来传达未找到的结果:
long id = compute(); // returns -1. By hopping that it not a valid id...
Run Code Online (Sandbox Code Playgroud)
然后,从客户端,你必须深入了解compute()id 值是否可以为空以及是否可以为空,哪个值代表空。
最后你可以这样写:
if (id == -1){
throw new IllegalArgumentException("the id is mandatory");
}
Run Code Online (Sandbox Code Playgroud)
假设明天-1是一个有效的 id,那么您应该更改实现和客户端代码以了解它:根本不可维护并且非常容易出错。
该OptionalLong方法更加稳健:
OptionalLong optId = compute(); // returns OptionalLong.empty();
Run Code Online (Sandbox Code Playgroud)
作为您的客户,compute()您知道 id 可能为空(Optional语义),并且您还知道如何以标准方式处理它:Optional` 展开函数。
long mandatoryId = optId.orElseThrow( ()-> new IllegalArgumentException("the id is mandatory");
Run Code Online (Sandbox Code Playgroud)
这里OptionalLong甚至Optional<Long>提供了三重优势(关于它们之间的区别,我建议Nishant 的出色答案):
-1方法)。Optional及其功能)但一般来说,Optionals 和Objects 包含在“仅”提供这两个优点:
Optional及其功能)