Java JDK8新特性Optional类
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类相关推荐
- JDK8新特性-Optional类
个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 JDK8新特性-Option ...
- JDK8新特性 - Optional类
引言 Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException).本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空 ...
- Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
- java 8 optional 类,Java8新特性-Optional类
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...
- Java8新特性——Optional 类
文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...
- Java8新特性 Optional类
作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...
- Java8新特性Optional类
这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...
- Java8新特性-Optional类
概念:Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这 ...
- Java JDK8新特性Stream流
1.Stream流 1. 流,支持处理数据处理操作的源生成的元素序列.流有两个重要特性:1流水线:很多流操作本身会返回一个流,这样多的操作就可以链接起来,形成一个大的流水线.2,内部迭代.流的迭代是在 ...
最新文章
- C/C++指向指针的指针
- linux在机房设置ip,双线机房双IP linux设置路由
- JSP 第一天:提交表单--获取表单中的数据值
- php 一天只能点赞上一次,ThinkPHP3.2 实现浏览量和点赞量,每次访问页面浏览量+1以及每个登录用户只能对同一篇文章点赞一次-Go语言中文社区...
- vmware nat模式网络不通_【EVENG入门】 03EVENG网络运行环境(桥接模式、NAT模式、Cloud连接虚拟设备)...
- Python if语句Demo
- 剑指offer——面试题52:构建乘积数组
- POJ 2709 Painter 【贪心算法】
- python—将array格式图片保存至文件夹中
- [2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)
- 【Power BI--- M 语言】M语言与DAX 语言的区别
- 逻辑函数卡诺图法化简(一)
- U8g2 图形库必备!试试这几个即时生效的界面工具
- Java实现求质数(素数)
- ppt密码怎么设置,ppt权限密码如何破解?
- java int Integer
- 离线下载Android SDK(100%成功)
- 多行输入以及结束输入
- arm oe linux gnueabi 系统,OpenCV ARM移植(交叉编译opencv) arm-oe-linux-gnueabi-gcc编译opencv3.1.0...
- 【bzoj 1616】: [Usaco2008 Mar]Cow Travelling游荡的奶牛 dp