自上次【http://www.cnblogs.com/webor2006/p/8243874.html】函数式接口的学习告一段落之后,这次来学习一下Optional,它并非是函数式接口的概念,点击查看源码便知:

那它是用来干嘛的呢?其实用它是用来避勉非常常见的NPE(NullPointerException),我想对于java程序猿来说它是再亲切不过的了,往往项目上线之后由于它的存在可能会导致紧急上修复包把自己整得够呛,既然空指针异常在实际项目中是大量存在的,所以说现在有很多编程语言对空指针异常做了一定程序的规避,而规避的办法都是采用这次要学的Optional方式,所以说学习它还是很有意义的。

了解它从javadoc开始:

接着来查看一下什么叫"value-based" Classes,可以从J2SE文档点击链接查看说明:

根据官网的解释,那再回过头来看一下咱们学习的Optional:

既然它的构造方法是私有的,那如何构造它呢?提供了三个工厂方法来创建它:

下面一一看一下:

接下来再来看一下这两个方法:

好了,初步对Optional的这些方法有了了解之后,接下来使用一下它,光说不练假把式:

那如果把这个isPresent()判断去掉呢?

但是!!Optional的标准使用在拿值时一定用isPresent()方法来判断是否有值,如果缺少它的判断就直接去拿值可能会有空指针的问题。

那思考一下目前使用了Optional之后跟之前传统的使用有啥不同,下面对比下:

既然本质没啥区别,那干嘛要使用Optional呢?其实目前Optional的写法还是用的传统面向对象的写法,而它推荐的写法不是这样的,那是怎样的呢?看一下IDE的提示:

鼠标放在上面既可以看到提示:

那推荐的这种函数式的编程风格长啥样呢?继续可以使用智能ide的提示来修改,如下:

编译运行:

这才是Optional使用的一个推荐的方式,那optional.ifPresent()方法是怎么定义的呢?看下源码:

既然不担心空指针的问题,那下面来验证下我们构造一个null的Optional对象,然后看是否会报空指针:

另外Optional还有其它的一个有用的方法,比如说如果发现值为null则打印一个默认的值,具体怎么做呢,如下:

看一下它的具体实现:

接着继续使用Optional的其它方法:

那看一下它的方法定义:

所以咱们定义一个有值的Optional验证一下:

另外对于Optional还有另外一个择中的方法ofNullable(),也就是既可以有值也可以没值,如下:

关于这三个工厂方法:empty()、of()、ofNullable(),具体要怎么选择呢?如果实际发现数据一定是null则可以有empty(),而如果一定不是null则可以选用of(),如果不能确定该数据是空还不是空则可以用ofNullable(),具体场景具体选择。

接下来再来举另外一个例子,对于一个方法如果返回一个集合,当集合数据为空的时候这时好的写法就是不要直接加为null,而是要返回一个空的集合,这样对于调用方而言就不会对集合数据进行判空了,所以以它为例再来看一下使用Optional的好处,首先建两个实体,这两个实体是一对多的关系,如下:

接着实例化一些数据,如下:

接着再从company中取出所有的员工,有可能为空也有可能不为空,按传递的写法可能是这样写,伪码如下:

那接下来用Optional如何用更简单的方式来达到上面同样的效果:

其中map()方法看一下它的定义:

接下来编译运行:

接下来将公司的员工信息去掉,再来看打印:

可见用Optional处理这块的逻辑完全是函数式风格的,看着也比较舒服。

另外还有一个细节需要注意,如果将Optional做为一个方法的参数,如下:

然后看一下具体是啥警告:

接着继续读一下原因:

再看一下Optional类,确实是木有实现序列化接口:

所以这里需要强调:不要将Optional作为方法参数进行定义,也不要在类中声明Optional类型的变量,Optional通常只做为方法的返回值来规避空指针问题。

java8学习之Optional深入详解的更多相关文章

  1. java8学习之方法引用详解及默认方法分析

    方法引用: 之前花了很多时间对Lambda表达式进行了深入的学习,接下来开启新的主题---方法引用(Method References),其实在之前的学习中已经使用过了,如: 那方法引用跟Lambda ...

  2. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  3. [深入学习Web安全](5)详解MySQL注射

    [深入学习Web安全](5)详解MySQL注射 0x00 目录 0x00 目录 0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步—— ...

  4. Shell学习之Bash变量详解(二)

    Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...

  5. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  6. Linux学习之用户配置文件详解(十四)

    Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...

  7. [转载]springmvc学习之@ModelAttribute运用详解

    spring学习之@ModelAttribute运用详解 链接

  8. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  9. Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

    [Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.And ...

随机推荐

  1. J-流浪西邮之寻找火石碎片 【经典背包变形】

    题目来源:2019 ACM ICPC Xi'an University of Posts & Telecommunications School Contest 链接:https://www. ...

  2. 小记--------spark的worker原理分析及源码分析

     

  3. Zero Array---思维题

    链接        submit B. Zero Array time limit per test 1 second memory limit per test 256 megabytes inpu ...

  4. Linux就该这么学——新手必须掌握的命令之常用的系统工作命令

    echo命令 含义:echo命令用于在终端输出字符串或变量提取后的值,格式为 : echo [字符串|$变量] 示例: 将”Linuxprobe.com”输出到终端屏幕的命令为: [root@linu ...

  5. Python学习笔记:运算符

    逻辑运算符: +   加 -    减 *    乘 /    除 %  取模-返回除法的余数 **  幂-返回x的y次方 //  整除 比较运算符: ==      等于-比较对象是否相等 !=  ...

  6. drf序列化及反序列化

    假如把drf看做一个汉堡包,我们之前讲的模块属于汉堡包前面的盖盖(请求模块.渲染模块)和底底(异常模块.解析模块.响应模块),但是真正中间的夹心没有讲,那么今天我就和大家来看一下汉堡包的夹心(序列化及 ...

  7. WPF——Application

    Application类处于WPF应用程序的最顶端,main函数就在这个类中. Application类的作用: 截图连接 https://docs.microsoft.com/zh-cn/dotne ...

  8. 美团2017年CodeM大赛-初赛A轮 C合并回文子串

    区间dp一直写的是递归版本的, 竟然超时了, 学了一下非递归的写法. #include <iostream> #include <sstream> #include <a ...

  9. poj 2226 Muddy Fields (二分图)

    大意:给定n*m网格, 每个格子为泥地或草地, 可以用一些长度任意宽度为1的木板盖住泥地, 要求不能盖到草地, 求最少要多少块木板能盖住所有泥地. 最小点覆盖板子题, 建图跑最大匹配即可. #incl ...

  10. redis 学习(18)-- AOF

    redis -- AOF 什么是 AOF 通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中. 日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中. 当redi ...