java - 为什么 optionalLong/Double 和 orElseThrow?
问题描述
有了释放Java-11
,为什么我们有orElseThrow
with optionalLong
/OptionalDouble
和other Optional Types
,当我们可以直接检查一个数字是否不为空或不等于特定数字时。
另外,我们正在做空检查,这比抛出异常要好?
可能无法形象化 和 的真实optionalTypes
使用orElseThrow
。
用于orElseThrow
.
解决方案
当我们可以直接检查一个数字是否不为空或不等于特定数字时,为什么我们有 orElseThrow 和 optionalLong / OptionalDouble。
并非如此,Optional
s 是为返回类型设计的,而不是用于检查输入参数。在后面的情况下,检查 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
及其功能)
但总的来说,包含Optional
s 的Object
s “仅”提供以下两个优点:
- 空箱返回的生活文件
- 传达和处理空虚返回的标准方法(
Optional
及其功能)
推荐阅读
- python - 使用 pdfminer 解析 pdf 时忽略编码错误
- javascript - 我正在尝试使用 nodejs 代码从 GPC 中删除特定的任务队列
- c# - 我在我的主类函数中使用浮动价格和 int categoryDD,但是当我在保存按钮中转换它时,它给了我错误
- javascript - 以编程方式从移动设备上的元素中删除“悬停状态”
- go - 与守护进程的数据交换
- c++ - 带有 OpenCV4 C++ 的节点插件模块
- c++ - 在 TCHAR 数组上构造 if 语句
- java - 无法使用 getExternalFilesDir() 将文件保存到设备下载文件夹
- laravel - 为什么laravel查询有加号问题
- python - 如何在 Pandas 中比较 3 个或更多 DataFrame 的相等性?