在程序运行时,空指针异常应该是最常见的异常之一,因此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. Rocket - tilelink - HintHandler

    https://mp.weixin.qq.com/s/MHW_aBSL72YNee9bVWWeaw   简单介绍HintHandler的实现.   ​​   1. 基本功能   实现Hint请求的处理 ...

  2. AUTOSAR-软件规范文档中的UML

    https://mp.weixin.qq.com/s/vm5vWNSpbNIYh25-LjJfYg   AUTOSAR软件规范文档中存在两种UML图: Sequence diagrams Config ...

  3. Python编程思想(3):数字及其相关运算

    Python 提供了三种数值类型:int(整型),float(浮点型)和complex(复数). int:通常被称为整型或者整数,如200.299.10都属于整型: float:浮点数包含整数和小数部 ...

  4. 从0开始探究vue-双向绑定原理

    理解 vue是一个非常优秀的框架,其优秀的双向绑定原理,mvvm模型,组件,路由解析器等,非常的灵活方便,也使开发者能够着重于数据处理,让开发者更清晰的设计自己的业务. 双向绑定,就是数据变化的时候, ...

  5. ASP.NET通过更改Url进行页面传值

    这里,通过假数据,手动创建的一个类,然后创建的一个集合,放入下拉框,选好值以后,点确定 会在另一个页面产生对应的id,有不懂的欢迎评论 创建一个类: using System; using Syste ...

  6. Java实现 蓝桥杯VIP 算法提高 淘淘的名单

    算法提高 淘淘的名单 时间限制:100ms 内存限制:8.0MB 问题描述 by ZBY- ? 淘淘拿到了一份名单,他想对上面的名字进行处理,挑出一些特殊的名字,他请你来帮忙. 淘淘关注以下名字: 如 ...

  7. 第六届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.熊怪吃核桃 题目描述 森林里有一只熊怪,很爱吃核桃.不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份.如果不能等分, ...

  8. Java实现 洛谷 P1280 尼克的任务

    import java.util.Scanner; public class Main { public static class edg{ private int to; private int n ...

  9. java实现第七届蓝桥杯路径之谜

    路径之谜 题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡. 城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到 ...

  10. 浅谈js原型

    前言 突发奇想,想写一篇原型的文章,也可能是因为对原型有更深的理解吧,在这里做个记录,来记录下自己的理解加深下记忆. 总之,希望本文的内容能够对您的学习或者工作有所帮助.另,如果有任何的错误或者不足请 ...