文章目录

  • Pre
  • 用 Optional 封装可能为 null 的值
  • 异常与 Optional 的对比
    • 避免使用基本类型的Optional对象


Pre

Java 8 - Optional全解相信你已经了解,有效地使用 Optional 类意味着你需要对如何处理存在缺失值进行全面的反思。这种反思不仅仅限于你曾经写过的代码,更重要的可能是,你如何与原生Java API实现共存共赢。

实际上,我们相信如果 Optional 类能够在这些API创建之初就存在的话,很多API的设计编写可能会大有不同。为了保持后向兼容性,我们很难对老的Java API进行改动,让它们也使用Optional ,但这并不表示我们什么也做不了。你可以在自己的代码中添加一些工具方法,修复或者绕过这些问题,让你的代码能享受 Optional 带来的威力。

接下来我们会通过几个实际的例子讲解如何达到这样的目的


用 Optional 封装可能为 null 的值

现存Java API几乎都是通过返回一个 null 的方式来表示需要值的缺失,或者由于某些原因计算无法得到该值。比如,如果 Map 中不含指定的键对应的值,它的 get 方法会返回一个 null 。但是,正如我们之前介绍的,大多数情况下,你可能希望这些方法能返回一个 Optional 对象。你无法修改这些方法的签名,但是你很容易用 Optional 对这些方法的返回值进行封装装。

我们接着用 Map 做例子,假设你有一个 Map<String, Object> 方法,访问由 key 索引的值时,如果 map中没有与 key 关联的值,该次调用就会返回一个 null 。

Object value = map.get("key");

使用 Optional 封装 map 的返回值,你可以对这段代码进行优化。要达到这个目的有两种方式:

  • 你可以使用笨拙的 if-then-else 判断语句,毫无疑问这种方式会增加代码的复杂度;
  • 或者你可以采用我们前文介绍的 Optional.ofNullable 方法
Optional<Object> value = Optional.ofNullable(map.get("key"));

每次你希望安全地对潜在为 null 的对象进行转换,将其替换为 Optional 对象时,都可以考虑使用这种方法。


异常与 Optional 的对比

由于某种原因,函数无法返回某个值,这时除了返回 null ,Java API比较常见的替代做法是抛出一个异常。、

这种情况比较典型的例子是使用静态方法 Integer.parseInt(String) ,将String 转换为 int 。在这个例子中,如果 String 无法解析到对应的整型,该方法就抛出一个NumberFormatException

最后的效果是,发生 String 无法转换为 int 时,代码发出一个遭遇非法参数的信号,唯一的不同是,这次你需要使用 try / catch 语句,而不是使用 if 条件判断来控制一个变量的值是否非空。

你也可以用空的 Optional 对象,对?遇无法转换的 String 时返回的非法值进行建模,这时你期望 parseInt 的返回值是一个 optional 。我们无法修改最初的Java方法,但是这无碍我们进行需要的改进,你可以实现一个工具方法,将这部分逻辑?装于其中,最终返回一个我们希望的Optional 对象。

【将 String 转换为 Integer ,并返回一个 Optional 对象】

我们的建议是,你可以将多个类似的方法?装到一个工具类中,让我们称之为 Optiona-lUtility 。通过这种方式,你以后就能直接调用 OptionalUtility.stringToInt 方法,将String 转换为一个 Optional<Integer> 对象。

避免使用基本类型的Optional对象

与 Stream 对象一样, Optional 也提供了类似的基础类型—— OptionalInt 、 OptionalLong 以及 OptionalDouble .

比如上面的方法可以不返回 Optional<Integer> ,而是直接返回一个 OptionalInt 类型的对象。 我们讨论过使用基础类型 Stream 的场景,尤其是如果 Stream 对象包含了大量元素,出于性能的考量,使用基础类型是不错的选择,但对 Optional 对象而言,这个理由就不成立了,因为 Optional对象最多只包含一个值。

不推荐使用基础类型的 Optional ,因为基础类型的 Optional 不支持 map 、flatMap 以及 filter 方法,而这些却是 Optional 类最有用的方法。

此外,与 Stream 一样, Optional 对象无法由基础类型的 Optional 组合构成,所以,举例而言,如果上面的代码中返回的是 OptionalInt 类型的对象,你就不能将其作为方法引用传递给另一个 Optional 对象的 flatMap 方法。

Java 8 - Optional实战相关推荐

  1. java = 优化_Java9系列第7篇:Java.util.Optional优化与增强 - 字母哥博客 - 博客园

    我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还是有很多的特性值得关注.期待您能关注我,我将把java 9 ...

  2. java与es8实战之五:SpringBoot应用中操作es8(带安全检查:https、账号密码、API Key)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  3. java与es8实战之一:以builder pattern开篇

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<java与es8实战>系列 < ...

  4. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  5. JAVA高级——Optional

    JAVA高级--Optional 二.为何要避免null指针 三.使用Optional优化null判断 3.1.1 使用Optional优化Car类 3.1.2 Optional的几种模式 3.1.3 ...

  6. 使用Java 8 Optional避免空指针异常

    2019独角兽企业重金招聘Python工程师标准>>> Optional可以让你的代码具有可读性,且会避免出现空指针异常. 都说没有遇到过空指针异常的程序员不是Java程序员,nul ...

  7. Java并发编程实战笔记2:对象的组合

    设计线程安全的类 在设计现车让安全类的过程之中,需要包含以下三步: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 实例封闭 通过封闭机制与合适的加锁策略结合起来 ...

  8. 阿里技术专家加多:Java异步编程实战之基于JDK中的Future实现异步编程 | 文末赠书...

    正文共:14244 字 8 图 预计阅读时间: 36 分钟 本节内容摘自<Java异步编程实战>中的一小节. 一.前言 本节主要讲解如何使用JDK中的Future实现异步编程,这包含如何使 ...

  9. Java使用Optional与Stream来取代if判空逻辑(JDK8以上)

    Java使用Optional与Stream来取代if判空逻辑(JDK8以上) 通过本文你可以用非常简短的代码替代业务逻辑中的判null校验,并且很容易的在出现空指针的时候进行打日志或其他操作. 注:如 ...

最新文章

  1. WCF常见问题之端口共享
  2. saxreader读取服务器xml文件,使用SAXReader从xml文件读取元素
  3. 隐藏和伪装端口banner
  4. 自动查找并删除VC生成的临时文件
  5. 教你用100多行写一个数据库(附源码)
  6. 交易系统高并发下的幂等性设计原则
  7. CMakeLists.txt使用boost库
  8. oracle 日期改字符格式,如何在oracle10g中将字符串日期转换为日期格式
  9. vice versa VS the other way around
  10. iPhone手机获取uuid 方法
  11. 拓端tecdat|Python对商店数据进行lstm和xgboost销售量时间序列建模预测分析
  12. rust: 写CTP策略中的几个难点
  13. 极米科技非“极客”:研发多年未掌握核心科技,还向竞品购买专利
  14. android开发--不安装支付宝客户端调H5页面问题
  15. Android开发第一课--熟悉开发工具和第一个Android程序
  16. 基于GPT2_Chinese文本自动生成
  17. 四川大学软件学院保研预推免面试面经
  18. 51单片机定时/计数器的工作原理
  19. 动漫java从入门到入土_适合刚入宅的萌新悠哉观看的经典番,全员致郁,从入门到入土?...
  20. 【Spring】mybatis-spring

热门文章

  1. android studio wcf,将图像从android studio上传到Wcf Service
  2. 指针数组概念 和 函数指针数组实战 和指针函数的概念和实战
  3. c++ decltype
  4. sql 精读(六)获取每个类别中最受欢迎的商品
  5. python getattr调用自己模块_在Python中通过getattr获取对象引用的方法
  6. 统计和生成所有不同的二叉树
  7. 强化学习(一)---绪论
  8. 深度学习数学基础(一)~卷积
  9. 文巾解题 1433. 检查一个字符串是否可以打破另一个字符串
  10. 文巾解题 27. 移除元素