Optional类

1.该类java.util包下,是不能被继承的泛型类即:public final class Optional<T>。

2.该类有两个私有属性: T value和 静态 final Optional EMPTY =new Optional<>()。

3.该类类有两个私有构造方法:

private Optional();private Optional(T value) (该函数第一行会判空,如果传null,传抛空指针异常)源码如下。得出只能通过静态方法构造Optional对象。
private Optional(T value) {this.value = Objects.requireNonNull(value);
}
private Optional() {this.value = null;
}

4.该类只有通过下面三个静态方法,来创建Optional类对象:

4.1 创建空的Optional对象Optional类,看源码返回了Optional类的静态属性EMPTY:

Optional<String> empty = Optional.empty();

注意: 通过Optional类的静态方法empty()得到的对象empty,使用get()会抛出

throw new NoSuchElementException("No value present")。因为私有静态属性EMPTY的空参构造,将 value =null;

4.2  指定值封装Optional对象:

Optional<String> string =Optional.of("string");

注意:of(T value)方法传null,会报空指针异常,因为通过Optional类的单参构造返回对象。

4.3  null和值来封装Optional对象:

Optional<String> string1 = Optional.ofNullable("string");

注意:ofNullable(T value)方法可以传null,是因为value =null时,value=this.empty()。

Optional类的构造讲完了,接下来如何操作实例对象。

5. Optional类的静态方法T get(),如果创建的Optional对象有值,则返回值,没有值,则报异常:

Object s = Optional.ofNullable(null).get(); //报NoSuchElementException: No value present
String s1 = Optional.ofNullable("string").get();// s1="string"

Optional类的静态方法T orElse(T other),如果创建的Optional对象有值,则返回值,没有值,则返回orElse的方法传的参数:

System.out.println(Optional.ofNullable("string").orElse("other")); //输出string
System.out.println(Optional.ofNullable(null).orElse("other")); //输出 other

Optional类的静态方法T orElseGet(Supplier<? extends T> other),参数为函数式接口Supplier,作用提供一个参数t。如果创建的Optional对象有值,则返回值,没有值,则返回Supplier提供的参数t:

System.out.println(Optional.ofNullable("string").orElseGet(()->"other")); //输出string
System.out.println(Optional.ofNullable(null).orElseGet(()->"other")); //输出 other

Optional类的静态方法 T orElseThrow(Supplier<? extends X> exceptionSupplier),参数为函数式接口Supplier,作用提供异常(为Throwable的子类)。如果创建的Optional对象有值,则返回值,没有值,则返回Supplier提供的异常对象:

System.out.println(Optional.ofNullable("string").orElseThrow(()->new NullPointerException("空指针异常"))); //输出string
System.out.println(Optional.ofNullable(null).orElseThrow(()->new NullPointerException("空指针异常"))); // 抛出异常

6.Optional类的静态方法Optional<T> filter(Predicate<? super T> predicate),参数为函数式接口predicate,作用传一个参数t,返回boolean对象。如果创建的Optional对象的值满足条件,则返回该值封装的Optional对象,不满足条件,则返回Optinal.empty()对象:

System.out.println(Optional.ofNullable("string").filter(s -> s.length() < 3));//Optional.empty
System.out.println(Optional.ofNullable("string").filter(s -> s.length() > 3));//Optional[string]

注意:1.对Optional类的实例对象的值,传入filter方法的"string"->"string".length()<3,为true则返回该值封装的Optional对象,不满足条件,则返回Optinal.empty()对象。2.System.out.println()调用了Optional重写的toString()方法。

7.Optional类的静态方法Optional<U> map(Function<? super T, ? extends U> mapper),参数为函数式接口Function,作用传一个参数t,返回一个参数u。如果创建的Optional对象有值,将值传到Function,返回值再次封装到Optional对象中。

System.out.println(Optional.ofNullable("string").map(s -> s.toUpperCase()));//Optional[STRING]

8.Optional类的静态方法<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper),参数为函数式接口Function,作用传一个参数t,返回一个Optional<u>参数。如果创建的Optional对象有值,将值传到Function,返回值(Optional<U>)再次封装到Optional对象中。

System.out.println(Optional.ofNullable("string").flatMap(s->Optional.ofNullable(s+"11")));//Optional[string11]

9.Optional类的方法void ifPresent(Consumer<? super T> consumer),参数为函数式接口Consumer,作用接受一个参数t,做处理。如果创建Optional对象有值,进行Consumer接口中调用,没有值,则不执行Consumer接口调用:

Optional.ofNullable("string").ifPresent(s -> System.out.println(s));//输出string
Optional.ofNullable(null).ifPresent(s -> System.out.println("********"));//什么没有输出!

10.Optional类的方法boolean isPresent()。如果创建Optional对象有值,则返回true,否则返回false:

System.out.println(Optional.ofNullable("string").isPresent());//输出true
System.out.println(Optional.ofNullable(null).isPresent());//输出false

总结:在实际应用中,可以把类包装到Optional对象中,这样就可以Optional对象提供api。从而避免if(obj!=null)这样繁琐的非空判断。

Java JDK8新特性Optional类相关推荐

  1. JDK8新特性-Optional类

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...

  2. JDK8新特性 - Optional类

    引言 Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException).本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空 ...

  3. Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测

  4. java 8 optional 类,Java8新特性-Optional类

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...

  5. Java8新特性——Optional 类

    文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...

  6. Java8新特性 Optional类

    作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...

  7. Java8新特性Optional类

    这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...

  8. Java8新特性-Optional类

    概念:Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这 ...

  9. Java JDK8新特性Stream流

    1.Stream流 1. 流,支持处理数据处理操作的源生成的元素序列.流有两个重要特性:1流水线:很多流操作本身会返回一个流,这样多的操作就可以链接起来,形成一个大的流水线.2,内部迭代.流的迭代是在 ...

最新文章

  1. C/C++指向指针的指针
  2. linux在机房设置ip,双线机房双IP linux设置路由
  3. JSP 第一天:提交表单--获取表单中的数据值
  4. php 一天只能点赞上一次,ThinkPHP3.2 实现浏览量和点赞量,每次访问页面浏览量+1以及每个登录用户只能对同一篇文章点赞一次-Go语言中文社区...
  5. vmware nat模式网络不通_【EVENG入门】 03EVENG网络运行环境(桥接模式、NAT模式、Cloud连接虚拟设备)...
  6. Python if语句Demo
  7. 剑指offer——面试题52:构建乘积数组
  8. POJ 2709 Painter 【贪心算法】
  9. python—将array格式图片保存至文件夹中
  10. [2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)
  11. 【Power BI--- M 语言】M语言与DAX 语言的区别
  12. 逻辑函数卡诺图法化简(一)
  13. U8g2 图形库必备!试试这几个即时生效的界面工具
  14. Java实现求质数(素数)
  15. ppt密码怎么设置,ppt权限密码如何破解?
  16. java int Integer
  17. 离线下载Android SDK(100%成功)
  18. 多行输入以及结束输入
  19. arm oe linux gnueabi 系统,OpenCV ARM移植(交叉编译opencv) arm-oe-linux-gnueabi-gcc编译opencv3.1.0...
  20. 【bzoj 1616】: [Usaco2008 Mar]Cow Travelling游荡的奶牛 dp

热门文章

  1. 项目管理:项目进度管理该怎么做?
  2. np.arange()用法
  3. VSCode如何实现边写边改模式(使用浏览器预览)
  4. Centos 配置服务器
  5. Openstack:创建实例
  6. tp5 captcha 验证码配置以及验证
  7. golang依赖下载异常解决方法
  8. 直播学习---基础流程知识点
  9. EAGAIN、EWOULDBLOCK、EINTR与非阻塞
  10. 【C++】高斯消元算法