Java 8可选:如何使用它

Java 8带有新的Optional类型,类似于其他语言中提供的类型。 这篇文章将介绍这种新类型的使用方式,即主要用途。

什么是可选类型?

可选的是新容器类型,如果有可用值,则该容器类型将包装单个值。 因此,其含义是传达可能不存在该值的含义。 以这种方法为例:

public Optional<Customer> findCustomerWithSSN(String ssn) {...
}

返回Optional显式增加了该给定的社会保险号可能没有客户的可能性。

这意味着类型系统明确地迫使该方法的调用者考虑并处理可能没有使用该SSN的客户的可能性。

呼叫者将必须执行以下操作:

Optional<Customer> optional = findCustomerWithSSN(ssn);if (optional.isPresent()) {Customer customer = maybeCustomer.get();... use customer ...
}
else {... deal with absence case ...
}

否则,请提供默认值:

Long value = findOptionalLong(ssn).orElse(0L);

可选的用法有点类似于抛出检查异常的更熟悉的情况。 通过抛出一个已检查的异常,我们使用编译器来强制API的调用者以某种方式处理异常情况。

可选试图解决什么?

可选的方法是尝试通过增加构建更具表现力的API的可能性来减少Java系统中空指针异常的数量,这些API解释了有时缺少返回值的可能性。

如果从一开始就存在Optional,那么大多数库和应用程序可能会更好地处理缺少的返回值,从而减少了空指针异常的数量以及总体上的错误总数。

那么应该如何使用Optional?

可选应该用作可能不返回值的函数的返回类型

这是来自OpenJDK邮件列表的报价 :

“ JSR-335 EG相当强烈地认为,“可选”的使用不应超过仅支持“可选-返回”惯用语所需的内容。

有人建议甚至将其重命名为OptionalReturn”

在域驱动程序开发的上下文中,这意味着Optional应该用作某些服务,存储库或实用程序方法的返回类型,例如上面显示的方法。

什么是可选的,不尝试解决

可选并不意味着是一种避免所有类型的空指针的机制。 例如,仍然必须测试方法和构造函数的强制输入参数。

像使用null时一样,Optional不能帮助传达缺失值的含义 。 以类似的方式,null可能意味着许多不同的东西(找不到值等),因此缺少Optional值也可以。

该方法的调用者仍然必须检查该方法的javadoc以了解缺少Optional的含义,以便正确处理它。

同样,可以将被检查的异常捕获到一个空块中,这也没有阻止调用方调用get()并继续前进的方式。

仅返回null有什么问题?

问题在于该函数的调用者可能没有阅读该方法的javadoc,而忘记了处理null的情况。

这经常发生,并且是空指针异常的主要原因之一,尽管不是唯一的原因。

如何不使用可选?

可选不打算在这些情况下使用,因为它不会给我们带来任何好处:

  • 在域模型层中(不可序列化)
  • 在DTO中(相同原因)
  • 在方法的输入参数中
  • 在构造函数参数中

Optional对函数式编程有何帮助?

在链接的函数调用中,Optional提供了ifPresent()方法,该方法允许链接可能不返回值的函数:

findCustomerWithSSN(ssn).ifPresent(() -> System.out.println("customer exists!"));

有用的链接

Oracle的这篇博客文章进一步介绍了Optional及其用法,并将其与其他语言的类似功能进行了比较– 厌倦了Null指针异常?

该备忘单提供了Optional – Java 8 Cheat Sheet中的Optional的全面概述。

翻译自: https://www.javacodegeeks.com/2014/06/java-8-optional-how-to-use-it.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

strip用法

Python strip() 方法用于移除字符串头尾指定的字符&#xff08;默认为空格或换行符&#xff09;或字符序列。 注意&#xff1a;该方法只能删除开头或是结尾的字符&#xff0c;不能删除中间部分的字符。 str "00000003210Runoob01230000000"; print str.strip( 0 ); …

为JAVA性能而设计(一)

为JAVA性能而设计&#xff08;一&#xff09; 发布时间&#xff1a;2007-1-9 15:51:42 来源&#xff1a;JavaWorld 作者&#xff1a;Brian Go…为JAVA性能而设计&#xff08;二&#xff09; 发布时间&#xff1a;2007-1-9 15:52:57 来源&#xff1a;JavaWorld 作…

ubuntu16 升级pip3后报错File /usr/bin/pip3, line 9, in module from pip import main ImportError: cannot...

问题&#xff1a;ubuntu16 执行pip3 install --upgrade pip之后&#xff0c;pip3执行出错。 Traceback (most recent call last): File "/usr/bin/pip3", line 9, in <module> from pip import mainImportError: cannot import name main 截图如下&#xff1a;…

HTTP 简介

1、HTTP 简介 HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;&#xff0c;是用于从WWW万维网服务器传输超文本到本地浏览器的传送协议。 HTTP基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&#xff09…

计算机博士英语复试题目,博士复试自我介绍中英文双语解读

博士复试自我介绍中英文双语解读关于博士复试自我介绍中英文篇一(中文篇)尊敬的老师,晚上好!我很高兴能来这里参加面试。现在让我给一个简短的自我介绍。我是* * *,出生在* *。我是一个老师的信息科学与工程学院,山东科技大学。我在1997年进入这所大学,主修计算机科学与技术。2…

DataFrame.to_dict(orient='dict')英文文档翻译

本文转载自 https://blog.csdn.net/llx1026/article/details/77929287 DataFrame.to_dict(orientdict)将DataFrame格式的数据转化成字典形式参数&#xff1a;当然参数orient可以是字符串{dict, list, series, split, records, index}中的任意一种来决定字典中值的类型字典dict&…

如何在J2ME中创建MIDlet

总览 Java移动应用程序称为J2ME。 通常&#xff0c;当我们在移动技术领域工作时&#xff0c;我们必须考虑J2ME应用程序。 通过这种方式&#xff0c;我们可以开发我们的移动应用程序&#xff0c;也可以通过jad或jar文件将其安装在我们的设备中。 近年来&#xff0c;手机开发中最…

感悟测试驱动开发

软件开发方法学的泰斗Kent Beck先生最为推崇"模式、极限编程和测试驱动开发"。在他所创造的极限编程&#xff08;XP&#xff09;方法论中&#xff0c;就向大家推荐"测试先行"这一最佳实践&#xff0c;并且还专门撰写了《测试驱动开发》一书&#xff0c;详细…

如何用python写html的插件,使用python开发vim插件及心得分享

如何使vim下开发python调试更方便如何用 Python 给 Vim 写插件如何使 Vim 下开发 Python 调试更方便怎么用python调用matlab&#xff1f;打算用vim写Python 各位指点下:w 之后 文件被保存到哪了? 桌面上有个文件夹 怎么才能保存进去? 如何让:w保存在当前目录下 :q退出vim :wq…

创建一个学生信息表,与页面分离

一、需求分析 做一个jsp页面&#xff0c;动态显示信息表的内容。 1、 做一个实体类&#xff1a;StudentInfo &#xff08;包含4个字段&#xff09; 2、 如图模拟生成3条数据&#xff0c;本质上就是new StudentInfo 3个实例&#xff0c;每个实例代表一行记录&#xff08;后面…

【Unity】材质基础

【Unity】材质基础 a.基本概念 b.Albedo Maps反射率贴图 c.Alpha Maps着色器shader下四大渲染模式 d.Metallic and Smoothness Maps e.Normal Maps法线贴图 f.Height Maps g.Occlusion Maps h.Emission Maps i.Detail Mask & Secondary Maps j.Standard 金属/Standard&…

DictVectorizer中的fit_transform

导入特征提取化中的字典向量化 from sklearn.feature_extraction import DictVectorizer dv DictVectorizer () x_train dv.fit_transform(x_train) x_test dv.fit_transform(x_test) 此处的fit是找到当前字典中的键 举个例子&#xff1a; 如果x_test不fit,那x_test只能转化…

Java中的三态布尔值

我不时地想念Java中SQL的三值BOOLEAN语义。 在SQL中&#xff0c;我们有&#xff1a; TRUE FALSE UNKNOWN &#xff08;也称为NULL &#xff09; 时不时地&#xff0c;我希望自己也能用Java表达这种UNKNOWN或UNINITIALISED语义&#xff0c;而普通的true和false还不够。 实现…

阻塞分析

--阻塞 /*********************************************************************************************************************** 阻塞&#xff1a;其中一个事务阻塞&#xff0c;其它事务等待对方释放它们的锁,同时会导致死锁问题。 整理人&#xff1a;中国风(R…

科学计算机二进制算法,计算机是怎么理解二进制的?

计算机是怎么理解二进制的?计算机的发明最初纯粹是为了计算数字, 让一个机器能够通过输入不同的数字, 进行加减乘除等. 首先要约定好机器能处理的数是什么样的, 即输入是什么样的, 才能去制造计算机. 二进制只是一种尝试, 十进制也有科学家尝试过, 但由于复杂程度较二进制要高…

OpenCV人脸特效制作

https://blog.csdn.net/zxc024000/article/details/50456917 https://blog.csdn.net/huanghuangjin/article/details/81666134 DLibOpenCV 脸部跟踪张贴小物件(遮盖眼部或者眼睛变大) 所以首先需要人脸识别&#xff0c;然后再类似GAN之类的进行处理或生成 https://wysaid.org/9…

abp.event.on与abp.event.off使用

apb的全局事件 var eventName "app.createOrEditFieldModalSaved";var reloadPage function () { dt.ajax.reload();};abp.event.on(eventName, reloadPage); //弹窗关闭事件_modalManager.onClose(function () {//注销事件&#xff0c;要不然多次打开列表后&…

为JavaOne 2014做好准备!

保持那个想法&#xff01; 是的……我希望我能在Java One 2014上做演讲-但我现在只值得在梦里做到这一点&#xff01; 但是&#xff0c;没有什么阻止我遵循Java One并跟踪有关我最喜欢的主题的会话/对话。 我希望甲骨文能够像我们2013年版那样&#xff0c;像我们这样的凡人在网…

WPF 实现ScrollViewer的垂直偏移滚动跳转

问题&#xff1a;考虑屏幕大小&#xff0c;一般都是会在表单问卷的页面使用ScrollViewer。问卷中问题漏填漏选时&#xff0c;在提交时校验不过&#xff0c;需要滚动跳转至漏填漏选项。 页面如下&#xff1a; 每个选项使用StackPanel&#xff0c;并对复选框和单选的勾选事件进行…

13 个应该记住的最不寻常的搜索引擎

13 个应该记住的最不寻常的搜索引擎 如果你通过Digg或其他社会化媒体网站&#xff0c;向世界传播&#xff0c;我会非常感激&#xff0c;您对此文的随手评论会让此文展示在更多人面前。谢谢 你已经天天使用一些常见的搜索引擎&#xff0c;象 Google&#xff0c;Msn&#xff0c;Y…