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

Java 8可选:如何使用它相关推荐

  1. java实现可选形参_Java:可选的可选实现

    java实现可选形参 类java.util.Optional被实现为单个不可变的具体类,该类在内部处理两种情况. 一个有元素,一个没有元素. 让Optional作为一个接口并让两个不同的实现代替实现该 ...

  2. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  3. Java:可选的可选实现

    类java.util.Optional被实现为单个不可变的具体类,该类在内部处理两种情况. 一个有元素,一个没有元素. 让Optional作为一个接口并让两个不同的实现代替实现是一个更好的选择吗? 毕 ...

  4. java类可选,java – 是否有类可选,但非可选的类?

    它是方便的声明函数映射值和消费它们,如果它们存在. 在你有几个强制对象和几个可选的情况下,我发现自己包装在Optional.of(mandatoryObject)中的其他人,所以我可以使用相同的表达式 ...

  5. java可选参数_Java可选

    java可选参数 In this article, we'll explore Java Optional class which was introduced in Java 8. 在本文中,我们将 ...

  6. java值的传递_Java 8可选–基于值的类使用指南

    java值的传递 In this article, we will go through the use of Java 8 Optional class and understand what a ...

  7. MyEclipse的Java Web项目配置环境搭建-如何安装tomact

    1,首先说一下,这个没有什么安装包!他的所有文件如下: 它的启动靠的就是那个bin文件. Bin目录就是bin 目录通常存放 DLL 文件,二进制文件的集成! 2,那么如何让它自启动呢? 靠的就是系统 ...

  8. java转net_将java库转换为.net库

    动机: 充分利用java阵营众多的类库 工具: IKVM――把java bytecode 转换成IL程序,并提供大部分J2SE 1.4类的.net实现(IKVM.GNU.Classpath.dll) ...

  9. orelse_可选的orElse vs orElseGet

    orelse Java 8引入了一个很棒的Optional概念,我们在博客Java 8 Optional中进行了研究 . 因此,为了简要说明一下,Optional用于表示Optional对象或空值,而 ...

最新文章

  1. linux命令安装openssl函数库,ubuntu安装openssl库
  2. 设计模式学习笔记--Strategy 策略模式
  3. ntopng mysql_网络流量监控工具与分析Ntop和Ntopng
  4. jquery 利用CSS 控制打印样式
  5. 回溯法 —— 求解0/1背包问题(剪枝)
  6. 走出软件质量困境的指导性思想
  7. Java中下载jar包
  8. 安装opencv_contrib-3.4.9, fatal error: opencv2/xfeatures2d.hpp: 没有那个文件或目录. 解决方法
  9. h5在线游戏制作开发:h5模板打地鼠小游戏怎么制作?
  10. 自己搭的12V 电机驱动电路设计
  11. 微信小程序如何快速达到1000UV流量主开通要求
  12. Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhos
  13. android 4.4.4最新微信,微信旧版本安卓4.4.4可用
  14. AtCoder Beginner Contest 211
  15. GitBlit使用说明书
  16. STM32F407ZG 检测环境温度 CubeIDE
  17. 现在准备看《金赛性学报告》
  18. 什么是编码器、解码器?(CNN\RNN....)
  19. 浅析云原生模型推理服务框架KServe
  20. UI----Android开发艺术字体设置

热门文章

  1. JS中的基本和引用类型传递的比较
  2. 计算机辐射对人体影响吗,电脑屏幕辐射对人体的危害怎么解决?
  3. 三条中线分的六个三角形_八年级数学上册:三角形已知两条边如何求第三边
  4. java面试设计模式
  5. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc
  6. bmp180气压传感器工作原理_陕西压力传感器的工作原理信息推荐
  7. 单列集合Set的实现类HashSet
  8. 502无法解析服务器标头_编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match...
  9. 战神4 幕后花絮 概念艺术_Java 9幕后花絮:新功能从何而来?
  10. lucene快速入门_为Lucene选择快速唯一标识符(UUID)