为什么选择Long / Double和ElseThrow?

Che*_*agi 5 java java-10

在发布时Java-11,当我们可以直接检查一个数字是否不为null或不等于特定数字时,为什么要orElseThrowoptionalLong/ OptionalDoubleOptional Types一起使用。

另外,我们正在做空检查,这比抛出异常更好吗?

可能是无法想象真正使用的optionalTypesorElseThrow

适用于的Javadoc orElseThrow

dav*_*xxx 3

当我们可以直接检查一个数字是否不为空或不等于特定数字时,为什么我们有 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及其功能)