有道云笔记地址 (建议有道云打开,markdown文档,直接拷贝过来有一些问题)

引言

在java的开发中,有一个问题始终会伴随着开发的进程。记得我第一个项目的时候,有一个同事在评论我的代码的时候说到。那个火山君,你这个代码写的太烂了,完全没有考虑到对象可能是空的情况。具体的代码我不太记得,写一段伪代码。看了下面的代码,我感觉只要有开发经验(java开发经验)的小伙伴肯定会大喊一声,卧槽~这啥玩样!但是对于我这个小萌新来说,当时确实在开发的时候没有去想过这么个问题----NPE(Null Point Exception)。诸如此类的问题还有很多,但是NPE的处理不应该混杂在我们的业务之中,java程序设计者也想到了这个问题,为了规避这个问题,就提出来了Optional这个包装类。它的作用是值不存在的时候产生可代替物,而只有在存在的时候才会使用它的值。

1.Optional<T> 类

1.简单介绍

查看javadoc对Optional类(这是一个包装类)的解释,这是一个可能包含一个非空值或者空值的对象。看一下它的类图。Optional对象要么包装了一个T范型的类要么就是没有包装任何对象。

java doc可以暂时略过

在源码中,我看到了它的定义使用了class关键字,但是它的构造方法确是私有的。在下图中,可以清楚看到了编译器告诉我们,【Optional has private access in java.util.Optional】。但是如果通过反射是否可以new出它的示例宁? 

这样是不行的,因为构造方法也是私有的。那更改一下权限。 

还是不行。再试一下

再试一下,成功。其实我这边抛除一个疑问,既然可以通过反射来获取实例,那么私有构造函数的意义是什么?有了这个想法说明思考了。诚然,jdk8中这样的包装类没有进行防止反射,是因为java语言的特性,回归到到这边私有构造方法的意义就是让这个类的构建方法被定义,从而保证类的私有性。我这样的反射写法也没有什么意义。

2.部分方法详解

1.empty()

这是一个静态方法可以通过类型.empty()方法直接建立。它返回的是一个空的实例。

代码解析

这个怎么回事?不是说Optional可以规避空指针异常,怎么又出来了空指针异常。分析一下步骤一:Optional<Integer> optionalInteger = Optional.empty();申请一个空的对象,步骤二:optionalInteger.get()获取optionalInteger中的对象,步骤三:System.out.println打印这个对象。步骤二中获取对象可能是一个空对象,在打印空对象就很容出现空指针异常。那么需要如何来写宁?

2.orElse() / orElseGet() / orElseThrow()

当包装类不存在,执行orElse(执行这个里面的lambda的表达式),orElseGet(执行这个里面的lambda的表达式),orElseThrow()抛除这个异常。

orElseGet()

orElseThrow()

orElse()

写到这里,我不禁有个疑问,似乎orElse()和orElseGet()方法存在着某些交集。打开javadoc,注意:orElse()是return一个值,orElseGet()return the result of that invocation.(注意是返回的调用结果)参数中一个T other,一个是一个Supplier 接口(生产者,返回一个T类型的值)

3.map() 方法

这个一个映射方法,是将optional封装的包装类进行映射

  1. get()获取Optional包装的类的值,注意,get方法不能够防止NPE。

运行结果如下: 

使用flatMap(Stream接口中)来构建Optioanl类

产生将mapper应用于当前Optional值。

(这个示例来自java核心技术券II page13)

比如,存在一个可以生产Optional<T>的方法g(),并且T中有一个可以生产Optional<U++>的方法f(),那么想要得到U对象的实例,必须通过s.g().f()的组合。这样的组合在Java在开发中也会经常遇到,给出一下一段示例代码,对这样的结构来分析++

总结

最新文章

  1. JavaWeb监听器的使用(一)监听上下文和会话信息
  2. 【原】jQuery与CSS自动生成验证码
  3. windows下使用 linux命令好办法
  4. shell-bash学习02运算、拼接、重定向
  5. WCF初探-19:WCF消息协定
  6. anroid studio 找不到符号 位置: 类 drawable
  7. Hadoop 系统配置 map 100% reduce 0%
  8. Java中的递归原理分析
  9. 【转】 CoreGraphics QuartzCore CGContextTranslateCTM 用法
  10. air ios 输入遮挡问题
  11. [CLR via C#]1.5 本地代码生成器:NGen.exe
  12. Object-c学习之路四(oc内存管理autorelease)
  13. [2013-01-15]The Little Schemer 学习笔记
  14. (2).NET CORE微服务 Micro-Service ---- .NetCore启动配置 和 .NetCoreWebApi
  15. c/c++保存日志程序模板
  16. MI200e电力线通讯
  17. iOS开发(3):tips提示 | 如何提示一行文字或一个图片
  18. win7 64位 python启动报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-process-l1-1-0.dll
  19. Mac 下安装Ruby环境
  20. windows server r2 搭建 ftp服务器

热门文章

  1. VMware-viclient-all
  2. Hbase问题小结(一)
  3. ElasticSearch第三弹之存储原理
  4. 逆向工程初步160个crackme-------3
  5. 关于ollydbg的堆栈视图的使用(结合crackme2分析)
  6. Azure Storage 利用 azCopy 复制迁移数据
  7. 无连接运输:UDP
  8. 从零搭建springboot服务02-内嵌持久层框架Mybatis
  9. Spring 注解动态数据源设计实践
  10. [Python] Python工匠(Github)