首页 > 解决方案 > 为什么 optionalLong/Double 和 orElseThrow?

问题描述

有了释放Java-11,为什么我们有orElseThrowwith optionalLong/OptionalDouble和other Optional Types,当我们可以直接检查一个数字是否不为空或不等于特定数字时。

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

可能无法形象化 和 的真实optionalTypes使用orElseThrow

用于orElseThrow.

标签: javajava-10

解决方案


当我们可以直接检查一个数字是否不为空或不等于特定数字时,为什么我们有 orElseThrow 和 optionalLong / OptionalDouble。

并非如此,Optionals 是为返回类型设计的,而不是用于检查输入参数。在后面的情况下,检查 not null 或 range 有效性(对于原语)更有意义。
此外,这些功能并不新鲜。Java 8 已经引入了这些功能。


为了说明 的兴趣OptionalLong.orElseThrow(),假设您long从方法中搜索 id 但可能找不到该 id。
这是处理未找到值情况的代码。

如果没有OptionalLong,您应该选择一个任意的 long 值来传达未找到的结果:

long id = compute();  // returns -1. By hopping that it not a valid id...

然后,从客户端,你必须深入compute()了解 id 值是否可以为空以及是否为空,哪个值代表空的实现。
最后你可以这样写:

if (id == -1){
   throw  new IllegalArgumentException("the id is mandatory");
}

假设明天-1是一个有效的 id,所以您应该同时更改实现和客户端代码以了解它:根本不可维护并且很容易出错。

使用OptionalLong该方法更加健壮:

OptionalLong optId = compute(); // returns OptionalLong.empty();

作为您的客户,compute()您知道 id 可能为空(Optional语义),并且您还知道如何以标准方式处理它:Optional 展开函数。

long mandatoryId = optId.orElseThrow( ()-> new IllegalArgumentException("the id is mandatory");  

这里OptionalLong甚至Optional<Long>提供了三重优势(关于它们之间的差异,我建议Nishant 的出色答案):

  • 空箱返回的生活文件
  • 客户传达空虚价值的稳健性方式(相对于-1方法)。
  • 传达和处理空虚返回的标准方法(Optional及其功能)

但总的来说,包含Optionals 的Objects “仅”提供以下两个优点:

  • 空箱返回的生活文件
  • 传达和处理空虚返回的标准方法(Optional及其功能)

推荐阅读