在程序运行时,空指针异常应该是最常见的异常之一,因此JDK8提供了Optional来避免空指针异常。

首先说明JDK8新增的Optional及相关方法的使用

Optional的常用操作:
  Optional.of(T value) 创建一个Optional实例
  Optional.empty() 创建一个Optional空实例
  Optional.ofNullable(T value) 不为null,创建一个Optional实例,否则创建一个Optional空实例
  isPresent 判断是否包含值
  orElse(T t) 如果调用的对象包含值,则返回值,否则返回t
  orElseGet(Supplier s) 如果调用对象包含值,则返回值,否则返回s获取的值
  map(Function f) 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  flatMap(Function f) 与mapleis,要求返回值必须是Optional 接下来逐个演示使用方式
1、Optional.of(T value)    创建一个Optional实例,但是只能创建非空数据
        Optional<Student> optional = Optional.of(new Student("lcl",16));
log.info("optional.get()======================{}",optional.get());
//可以快速定位NullPointExecption位置
Optional<Student> optional1 = Optional.of(null);//320行
log.info("optional1.get()======================{}",optional1.get());

运行结果

可以看到,在第一次创建时,new了一个对象作为入参,成功创建了Optional对象,但是第二次创建时,由于入参是空值,因此创建失败,报空指针异常,且报错行数为320行(代码标红处)。

2、Optional.empty()     创建一个Optional空实例
        //Optional.empty()     创建一个Optional空实例
Optional<Student> optional2 = Optional.empty(); //324行
log.info("optional2.get()======================{}",optional2.get());//325行

运行结果:

可以看到在在324行创建了一个空的Optional,但是由于是空的,因此在325行使用get方法时,报了没有对象的异常信息

3、Optional.ofNullable(T value)  不为null,创建一个Optional实例,否则创建一个Optional空实例
        //Optional.ofNullable(T value)  不为null,创建一个Optional实例,否则创建一个Optional空实例
Optional<Student> optional2 = Optional.ofNullable(new Student("lcl",16));//328行
log.info("optional2.get()======================{}",optional2.get());
Optional<Student> optional3 = Optional.ofNullable(null);
log.info("optional3.get()======================{}",optional3.get());

测试结果:

测试结果中,创建optional2时,由于入参是新创建的对象,因此optional2不为空,使用get方法时,正常获取到数据,但是optional3创建时的入参是空,因此创建了一个空的Optional对象,因此使用get方法时,出现异常。

4、isPresent  判断是否包含值(为了防止前几步的异常信息,jdk8提供了判断optional是否为空的方法isPresent)
        Optional<Student> optional = Optional.of(new Student("lcl",16));
Optional<Student> optional2 = Optional.ofNullable(new Student("lcl",16));
log.info("optional.isPresent()======================{}",optional.isPresent());
log.info("optional1.isPresent()======================{}",optional2.isPresent());

测试结果:

2020-06-01 14:58:40.381  INFO 18628 --- [           main] com.example.jdk8demo.Jdk8StreamDemoTest  : optional.isPresent()======================true
2020-06-01 14:58:40.383 INFO 18628 --- [ main] com.example.jdk8demo.Jdk8StreamDemoTest : optional1.isPresent()======================true
5、orElse(T t)   如果调用的对象包含值,则返回值,否则返回t
        //ofElse(T t)   如果调用的对象包含值,则返回值,否则返回t
Optional<Student> optional = Optional.ofNullable(new Student("mm",25));
Optional<Student> optional2 = Optional.ofNullable(null); Student student = optional.orElse(new Student("lcl",18));
log.info("orElse======================{}",student);
student = optional2.orElse(new Student("lcl",18));
log.info("orElse======================{}",student);

测试结果:

2020-06-01 15:00:42.765  INFO 18864 --- [           main] com.example.jdk8demo.Jdk8StreamDemoTest  : orElse======================{"age":25,"name":"mm"}
2020-06-01 15:00:42.920 INFO 18864 --- [ main] com.example.jdk8demo.Jdk8StreamDemoTest : orElse======================{"age":18,"name":"lcl"}
6、orElseGet(Supplier s) 如果调用对象包含值,则返回值,否则返回s获取的值
        //ofElseGet(Supplier s) 如果调用对象包含值,则返回值,否则返回s获取的值
Optional<Student> optional2 = Optional.empty();
Student student1 = optional2.orElseGet(()->new Student("mm",16));
log.info("orElseGet======================{}",student1);
optional2 = Optional.of(new Student("kk",10));
Student student2 = optional2.orElseGet(()->new Student("mm",16));
log.info("orElseGet======================{}",student2);

测试结果:

2020-06-01 15:00:42.921  INFO 18864 --- [           main] com.example.jdk8demo.Jdk8StreamDemoTest  : orElseGet======================{"age":16,"name":"mm"}
2020-06-01 15:00:42.922 INFO 18864 --- [ main] com.example.jdk8demo.Jdk8StreamDemoTest : orElseGet======================{"age":10,"name":"kk"}
备注:这里有个点需要说明一下,就是如果T是一个调用,例如orElse(aaa.getStudent()),那么最好不要使用orElse,要使用orElseGet,因为orElse无论调用对象是否有值,

aaa.getStudent()都会被执行,如果是调用第三方接口,那就每次都会多一次请求,而orEleseGet就没有问题,如果调用对象为不为空,则不会走内置接口。
7、map(Function f)  如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
        Optional<Student> optional2 = Optional.of(new Student("kk",10));
Optional<String> name = optional2.map((x)->x.getName());
log.info("map======================{}",name);

测试结果:

2020-06-01 15:00:42.923  INFO 18864 --- [           main] com.example.jdk8demo.Jdk8StreamDemoTest  : map======================Optional[kk]
8、flatMap(Function f)   与mapleis,要求返回值必须是Optional,与map的差异:map返回值为Optional,flatMap返回值为Optional<Optional>
        optional2 = Optional.of(new Student("kk",10));
Optional<String> name1 = optional2.flatMap((x)->Optional.of(x.getName()));
log.info("flatMap======================{}",name1);

 测试结果:

2020-06-01 15:05:41.552  INFO 14604 --- [           main] com.example.jdk8demo.Jdk8StreamDemoTest  : flatMap======================kk

JDK8--08:Optional的更多相关文章

  1. Java8新特性之五:Optional

    NullPointerException相信每个JAVA程序员都不陌生,是JAVA应用程序中最常见的异常.之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPoin ...

  2. swift:Optional Type 、Swift和Objective-C混编的讲解

    ❤️❤️❤️swift中的Optional Type的?和!含义:其实就是一个装包和拆包的过程 optional的含义: Optional事实上是一个枚举类型,Optional包含None和Some两 ...

  3. Effective C++ 条款08:别让异常逃离析构函数

    1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...

  4. Spring Boot → 08:嵌入式Servlet容器自定义

    Spring Boot → 08:嵌入式Servlet容器自定义

  5. Java 8新特性(三):Optional类

    在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题.本篇文章将详细介绍Option ...

  6. Guava学习笔记(1):Optional优雅的使用null

    转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...

  7. 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇08:弹幕系统》本系列完结

    8.弹幕系统 弹幕系统概述: 弹幕系统的设计体现了射击游戏的基本要素,玩家要在敌人放出的大量子弹(弹幕)的细小空隙间闪避,能在玩家闪躲弹幕的时候给玩家带来快感,接近满屏的子弹,增加了对玩家的视觉冲击力 ...

  8. Guava学习笔记:Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  9. [C#.NET 拾遗补漏]08:强大的LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrate ...

随机推荐

  1. (Java实现) 洛谷 P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...

  2. Java实现 LeetCode 519 随机翻转矩阵

    519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...

  3. Java实现 蓝桥杯VIP 算法训练 比赛安排

    问题描述 设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛.设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛. 输入格式 输入 ...

  4. Java实现 蓝桥杯VIP 算法训练求先序排列

    问题描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入格式 两行,每行一个字符串,分别表示中序和后序排列 输出格式 一个字符串,表示所 ...

  5. Java实现 蓝桥杯VIP 算法提高 三角形面积

    算法提高 三角形面积 时间限制:1.0s 内存限制:256.0MB 问题描述 由三角形的三边长,求其面积. 提示:由三角形的三边a,b,c求面积可以用如下的公式: s=(a+b+c)/2 输入格式 由 ...

  6. Java实现 蓝桥杯VIP 算法提高 不同单词个数统计

    算法提高 不同单词个数统计 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数.例如:对于句子"one little t ...

  7. Java实现 洛谷 P1422 小玉家的电费

    import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Sc ...

  8. Linux 用户管理命令-userdel和su

    userdel [选项] 用户名,可以删除用户,常用选项 -r :删除用户的同时删除用户的家目录,一般都要用,例如:userdel -r xbb 新建用户和删除用户的本质也就是修改了 /etc/sha ...

  9. 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  10. idea 启动命令行的时候提示不能创建PTY

    问题描述: 昨天上午,凯哥还在好好的使用idea,中午的时候,360扫描,好像要升级还是要干嘛的,没细看,然后凯哥就点击确定.结果到下午使用idea的Terminal 命令行的时候提示,如下图错误: ...