介绍

Optional是JDK8中提供用于包含未知对象的工具类,即可以利用Optional包装对象来避免繁琐的空指针检查,以及NullPointException的处理,在Optional中,用value代表所包裹的对象。

API

table th { width: 100px; }

方法名称 返回类型 参数 功能
static empty Optional 生成一个空的Optional对象
static of Optional T value 返回一个包裹给定对象的Optional对象
static ofNullable Optional T value 若参数对象不为null,这返回包裹该参数对象的Optional对象,否则返回一个空的Optional对象
equals boolean Object 仅当参数类型为Optional 且 参数中的Optional包裹的值与参数中的值相等时返回为true其余都返回false
filtrer Optional Predicate<? super T > predicate 过滤器,过滤出满足predicate函数中定义的判断条件的value,并将此value用Optional包裹起来,若value都不满足,这返回一个空的Optional对象
flatMap Optional Function<? super T,Optional> mapper 根据提供的映射函数,将Optional中的value值应用与mapper方法,并将返回结果包装为一个Optional对象,若mapper返回结果为null,这返回一个空的Optional对象
get T 返回Optional中的value,若Optional为空,则抛出NoSuchElementException
hsahCode int 返回value的hashCode值,若value为null,则返回0
ifPresent void Consumer<? super T> consumer 若Optional中value不为空,则让value执行参数提供的consumer函数,否则不采取任何行动
ifPresentOrElse void Consumer<? super T> consumer, Runnable emptyAcrion 若Optional中value不为空,则让value执行参数提供的consumer函数,否则执行参数提供的emptyAction中的run方法
isPresent boolean 判断Optional中value是否为空,为空则返回false
map Optional Function<? super T, extends U> mapper 若Optional中value不为空,则将value应用与提供的mapper方法,并且若返回结果不为空,则返回包裹该结果的Optional对象
orElse T T other 若Optional中的value不为空,则返回该value,否则返回参数提供的other
orElseGet T Supplier<? extend T > other 若Optional中的value不为空,则返回value,否则返回函数other的执行结果
orElseThrow T Supplier<? extends X> exceptionSupplier 若Optional中的value为空,则执行参数提供的函数,并抛出参数函数中指定的异常信息

Optiona使用

  • 1 Optiona对象的获取一共有三种方式,都是静态方法,同时Optional源码中将构造函数设置为私有,以及提供了一个静态常量 EMPTY来表示值为空的Optional对象。of 与 ofNullable的区别在于当给定的参数为null时,of会抛出NullPointException,而ofNullable则会返回一个空的Optional对象,对于希望避免处理NullPointException的建议还是使用ofNullable。
  • 2 get是返回当前Optional对象中的value对象,一般需要配合isPresent() 或 isEmpty()先进行判断在做处理,否则还需要专门处理NoSuchElementException异常。
  • 3 ifPresent值仅提供了当Optional中value不为null时的处理方法,而ifPresentOrElse则提供了两种处理方法,value不为空则执行comsumer方法,否则执行Runnable的emptyAction方法.
  1. Person p1 = null;
  2. Optional<Person> pop2 = Optional.ofNullable(p1);
  3. pop2.ifPresent(person -> {System.out.println(person);});
  4. pop2.ifPresentOrElse(person -> {System.out.println(person);},() ->{System.out.println("the value is empty!");});
  • 4 filter用于判断,若Optional中的value满足参数提供的predicate函数,这返回该Optional对象,否则返回value为空的Optional对象
  1. Person person1 = new Person("kaithy",23);
  2. Person person2 = new Person("lucy",24);
  3. Person person3 = new Person("lili",25);
  4. List<Person> persons = new ArrayList<>();
  5. persons.add(person1);
  6. persons.add(person2);
  7. persons.add(person3);
  8. Optional<List<Person>> optional = Optional.ofNullable(persons);
  9. Optional<List<Person>> fop = optional.filter(people -> {return people.contains(person1);});
  10. //判断是否为同一个对象,结果显示为true
  11. System.out.println(fop == optional);
  12. System.out.println(fop.equals(optional));
  • 5 map 与 flatMap 功能都是将Optional中的value执行参数提供的mapper函数,将value映射为一个新的值,并将新值用Optional包裹,若value为null,则会返回EMPTY。区别在于,若mapper函数返回的结果为null,map会返回一个EMPTY,但是flatMap则会抛出NullPointException。

    (PS:(1).映射的后的值会用一个新的Optional对象包裹,而非更新原有的value值;

    (2).所有value为null的Optional对象都是相同的,即Optional中提供的EMPTY这一静态常量);
  1. Person person1 = new Person("kaithy",23);
  2. Person person2 = new Person("lucy",24);
  3. Optional<Person> optional = Optional.ofNullable(person1);
  4. Optional<Person> mapOp = optional.map(person -> {
  5. return null;
  6. });
  7. System.out.println(mapOp.isPresent());
  8. Optional<Person> mapOp2 = optional.map(person -> {return null;});
  9. System.out.println(mapOp == mapOp2);
  10. Optional<Person> mapOp3 = optional.map(person -> {return person;});
  11. //mapper返回值相同,判断是否是同一个Optional对象
  12. System.out.println(optional == mapOp3);
  13. //会抛出NullPointException
  14. Optional<Person> flatMapOp = optional.flatMap(person -> {
  15. return null;
  16. });
  • 6 or 中提供的参数用于当Optional中的value为null时,生成一个特定的Optional对象的方法,当value不为空,这直接返回当前的Optional对象,否则就用supplier函数生成一个Optional对象,若supplier为null或返回结果为null,会抛出NullPointException。
  1. Person person1 = new Person("kaithy",23);
  2. Person person2 = new Person("lucy",24);
  3. Optional<Person> optional = Optional.ofNullable(person1);
  4. Optional<Person> mapOp = optional.map(person -> {
  5. return null;
  6. });
  7. mapOp = mapOp.or(()->{
  8. return Optional.ofNullable(person2);
  9. });
  10. System.out.println(mapOp.isPresent());
  • 7 orElse、orElseGet、orElseThrow分别代表了一种获取当前Optional中value值的方式,若value为null,orElse返回参数中的值,orElseGet返回参数提供的函数的执行结果,orElseThrow这抛出异常,默认NullPointException,也可以在参数中指定要抛出的异常类型
  1. Person person1 = new Person("kaithy",23);
  2. Person person2 = new Person("lucy",24);
  3. Optional<Person> optional = Optional.ofNullable(person1);
  4. Optional<Person> mapOp = optional.map(person -> {
  5. return null;
  6. });
  7. Person p1 = mapOp.orElse(person2);
  8. System.out.println(p1);
  9. Person p2 = mapOp.orElseGet(() ->{
  10. return new Person("laila",25);
  11. });
  12. System.out.println(p2);
  13. try {
  14. Person p3 = mapOp.orElseThrow(() ->{
  15. return new RuntimeException("empty value");
  16. });
  17. System.out.println(p3);
  18. }catch (RuntimeException e) {
  19. System.out.println(e.getMessage());
  20. }

上文转载自自己的个人博客,主要记录自己的成长经历,用输出倒逼自己努力学习。链接地址:https://kaithyrookie.github.io/2018/10/20/Java-Optional%E4%BD%BF%E7%94%A8/

JDK8 Optional操作学习的更多相关文章

  1. Java8中的Optional操作

    作者:汤圆 个人博客:javalover.cc 前言 官人们好啊,我是汤圆,今天给大家带来的是<Java8中的Optional操作>,希望有所帮助,谢谢 文章纯属原创,个人总结难免有差错, ...

  2. MySQL4.0命令操作学习笔记

    声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...

  3. Git 操作 学习资源 网址

    用git 有一段时间了,有点自己的小心得.个人觉得相对SVN来讲他更灵活,更合理. 陆陆续续的收集了一些学习资源: 1.理解Xcode 中的Git 版本控制 http://www.open-open. ...

  4. 使用git和github管理自己的项目---基础操作学习[转]

    原文: https://segmentfault.com/a/1190000003728094 我是通过看廖雪峰的git教程学习的,真的是极好的,以下是我学习过程中的总结,记录下来,方便自己参考以熟悉 ...

  5. Git操作学习笔记

    根据廖雪峰老师git教程学习整理 这里需要辨析一下概念.Github是代码托管平台,是协作的工具;而Git是版本控制工具.Git不需要联网,在本机就可以使用 集中式版本控制系统与分布式版本控制系统 S ...

  6. R中双表操作学习[转载]

    转自:https://www.jianshu.com/p/a7af4f6e50c3 1.原始数据 以上是原有的一个,再生成一个新的: > gene_exp_tidy2 <- data.fr ...

  7. jdk8 Optional使用详解

    思考: 调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法. 原来解决方案: 我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数.这正是一些类似Guav ...

  8. jdk8 流操作

    二.流 2.1 流介绍 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).就现在来说,你可以把它们看成遍历数据集的高级迭代器.此外,流还可以 ...

  9. jQuery HTML操作学习笔记

    学习资料 jQuery教程 获取 1.获取.设置元素的内容 1.1获取或设置目标元素的文本内容 语法 $(selector).text(); 获取元素文本内容 $(selector).text(con ...

随机推荐

  1. spring cloud config使用mysql存储配置文件

    spring cloud config使用mysql存储配置文件 1.结构图 2.pom.xml: <?xml version="1.0" encoding="UT ...

  2. springboot中动态修改logback日志级别

    springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...

  3. elk安装和使用

    elk安装和使用 使用的版本都是5.2.0 elasticsearch-5.2.0安装 在官网 下载 elasticsearch tar包 解压安装 tar zxf elasticsearch-5.2 ...

  4. 在命令行已经pip install flask-script,但是导包时出错

    问题:(已经安装好了flask-script,但是导入不成功) 然后在代码中导入相应的包:(报红) 后来发现是在自己创建项目的时候勾选的是创建的是在虚拟环境下的项目,所以环境有问题 所以我应该在虚拟环 ...

  5. 21 (OC) 数据持久化

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  6. Spring入门(十三):Spring MVC常用注解讲解

    在使用Spring MVC开发Web应用程序时,控制器Controller的开发非常重要,虽然说视图(JSP或者是Thymeleaf)也很重要,因为它才是直接呈现给用户的,不过由于现在前端越来越重要, ...

  7. Hadoop 之 深入探索MapReduce

    1.MapReduce基础概念 答:MapReduce作业时一种大规模数据的并行计算的便程模型.我们可以将HDFS中存储的海量数据,通过MapReduce作业进行计算,得到目标数据. 2.MapRed ...

  8. 使用 Jest 进行 Vue 单元测试

    本文介绍:1.vue-cli3下jest环境的搭建2.vue组件基本的测试方法 环境配置 vue-cli3 的插件使安装流程变得格外简单,通过 vue ui 启动可视化管理系统,在插件栏,点击 ‘添加 ...

  9. 第六届蓝桥杯java b组第8题

    乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶 ...

  10. koa和exprsss区别

    koa和exprsss区别 koa没有内置中间件 express有几个内置的中间件,如express.static()//加载静态资源 koa不再有req,res请求,它是封装在context里面 c ...