博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 8中的Optional: 如何正确使用?
阅读量:6278 次
发布时间:2019-06-22

本文共 1649 字,大约阅读时间需要 5 分钟。

翻译自

Java 8中出现一个新的Optional类型,和其他语言中null的替代品类似。 本文将讨论如何使用这种新类型,即它的主要用例是什么。

什么是Optional类型?

Optional是对单个对象包装的容器类型。Optional同样可以包装null。举例如下:

public Optional
findCustomerWithSSN(String ssn) { ...}复制代码

返回值由Optional包装了一层,语义上明确地表达了值为ssnCustomer对象是有可能不存在的。

这代表着从系统类型上明确的强制该方法调用者,考虑并处理Customer对象为null的可能性。

调用者不得不采用判断的处理方式:

Optional
optional = findCustomerWithSSN(ssn);if (optional.isPresent()) { Customer customer = optional.get(); ... use customer ...}else { ... deal with absence case ...}复制代码

或者提供默认值的处理方式:

public static Optional
findOptionalLong(){ return Optional.empty();}Long value = findOptionalLong(ssn).orElse(0L);复制代码

这种使用Optional的方法类似于抛出异常的情况。 通过抛出一个已捕获的异常,我们使用编译器来强制API的调用者以某种方式处理异常情况。

Optional想解决什么问题?

Optional通过包装一个对象,形成一个更具表现力的容器,用来减少Java系统中空指针异常的数量,Optional的API考虑了返回值丢失为null的可能性。

如果Java最开始就有Optional类,那么大多数库和应用程序可能会更好地处理丢失的返回值,减少空指针异常的数量和错误总数。

Optional没想解决什么问题?

Optional并不意味着是一种避免所有类型空指针的机制。

和null一样,Optional无法表达缺失值具体代表什么。比如说,null可以表示许多不同的事物(未找到值,变量未初始化等),但只是看到null这个值的时候并不知道是哪种情况,Optional同理。

Optional对函数文档的帮助有限,函数的调用者仍然需要查看函数的javadoc以理解Optional缺失值的含义,以便做出正确处理。

Optional的get()方法同样会产生空指针异常。

只返回null有什么问题?

问题在于函数的调用者可能没有阅读函数的javadoc,忘记处理null

这种情况经常发生,并且是空指针异常的主要原因之一。

Optional应该被怎样使用?

在返回值可能为null的函数中,Optional应该用做其返回类型。

在域驱动程序开发的上下文中使用,比如说某些服务,存储库或实用程序方法。

Optional不应该被怎样使用?

Optional不适合在下列场景中使用,不会有任何好处:

  • 在域模型层(不可序列化)
  • 在DTO中(不可序列化)
  • 函数的输入参数
  • 构造函数的参数

函数式编程对Optional起到怎样的帮助?

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

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

其他相关链接

来自Oracle的这篇博文进一步介绍了Optional和它的用途,并将其与其他语言中的类似功能进行了比较 -

此备忘单提供了Optional的全面概述 -

转载地址:http://ejfva.baihongyu.com/

你可能感兴趣的文章
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>