详解Java8 Optional类{最全}
1:Optional
1.1 概述
Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException),提供了一些的方法代替过去的if-else处理逻辑,并与Stream流结合提供一致性的函数式编程.
注意: Optional 不支持Java本身提供的序列化与反序列化机制,也就是RPC不能使用Java提供的序列化机制
1.2 方法概览
页面 看不清,请下载或者另一个页面打开即可看清楚

2: 常用方法
2.1 构造方法
- 需要提前检查NPE 使用of方法
- 不管情况直接构造 使用ofNULLable*()方法
- empty() 方法 前面方法间接使用了这个方法
@Test(expected = NoSuchElementException.class)
public void whenCreateEmptyOptional_thenNull() {
Optional<User> emptyOpt = Optional.empty();
emptyOpt.get();// 没有值 将会抛出异常
} @Test(expected = NullPointerException.class)
public void test_of() {
User user=null;
Optional<User> optional = Optional.of(user);
} @Test
public void test_ofNuLLAble() {
User user=null;
Optional<User> optional = Optional.ofNullable(user);
optional.orElse(new User());
// 一般不使用 optional.get();
}
2.2 取得值
- get方法取不到值将会抛出异常NPE
- orElse系列方法,在null值的情况 将会提供默认值
// 取得值
@Test
public void test_getValue() {
Optional<String> opt = Optional.ofNullable(null);
String str = opt.get();
String str2 = opt.orElse("Tom");
Assert.assertEquals("Tom", str2);
String str3 = opt.orElseGet(()->"Tom2");
Assert.assertEquals("Tom2", str3);
}
2.3 检查处理
// 检查处理
@Test
public void test_Check() {
Optional<String> opt = Optional.ofNullable(null); Assert.assertTrue(opt.isEmpty());
Assert.assertFalse(opt.isPresent());//not null if(opt.isPresent()) {
String string = opt.get().toUpperCase();
}
opt.ifPresent(x->x.toUpperCase()); //解决了if 问题 代码简洁 // 内部是runable 不能返回值 所以值这个方法功能有限 但是可以执行一些耗时操作
opt.ifPresentOrElse(x->x.toUpperCase(),()->System.out.println("sss"));
}
2.4 返回值
@Test
public void test_returnValue() {
Optional<String> opt = Optional.ofNullable(null); Assert.assertEquals("Cat", opt.orElse("Cat"));
Assert.assertEquals("Cat", opt.orElseGet(()->"Cat"));
// or 为jdk9 新方法
String str_tom = opt.or(()->Optional.of("Tom")).get();
Assert.assertEquals("Tom", str_tom);
}
2.5 返回异常
@Test(expected = NoSuchElementException.class)
public void test_return_Exception() {
Optional<String> opt = Optional.ofNullable(null); Assert.assertEquals("Cat", opt.orElseThrow()); Assert.assertEquals("Cat", opt.orElseThrow(()->new NoSuchElementException()));
}
2.6 转换 与过滤
@Test
public void test_MapAndFilter() {
String [] str= new String[] {"a","b","c","d","1"};
Optional<String[]> opt = Optional.ofNullable(str); // filter
String[] res = opt.filter(x->{
for (String s : x) {
if(s.contains("e")) {
return false;
}
}
return true;
}).get();
System.out.println(Arrays.toString(res));
// map 转大小
List<String> list=new ArrayList<>();
for(String x:str) {list.add(x);}; Optional<String> map = Optional.ofNullable(list).map(x->x.iterator().next().toUpperCase());
List<String> list2 = Optional.ofNullable(list).stream().
flatMap(x->x.stream().map(y->y.toUpperCase())).collect(Collectors.toList());
System.out.println(list2);
}
2.7 链式操作
- 支持链式操作,序列化滞后
@Test
public void Test_ChainCollec() {
Street street = new Street("武汉轻工大学", 5);
Address address = new Address(street);
Person person = new Person("Tom", 12,address ); String string = Optional.ofNullable(person).
flatMap(u->u.getAddress())
.flatMap(p->p.getStreet())
.map(l->l.getStreetName())
.orElse("default");
System.out.println(string); Address address2 = new Address(null);
Person person2 = new Person("Tom", 12,null);
String s3 = Optional.ofNullable(person2).flatMap(u->u.getAddress())
.orElse(new Address(null))
.getStreet()
.orElse(new Street("武汉大学", 1))
.getStreetName();
System.out.println(s3);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream obr;
try {
obr = new ObjectOutputStream(bos);
obr.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
} ByteArrayInputStream inputStream = new ByteArrayInputStream(bos.toByteArray());
try {
ObjectInputStream inputStream2 = new ObjectInputStream(inputStream);
Person person23 = (Person) inputStream2.readObject();
System.out.println(person23.getAddress().get().getStreet().get().getStreetName());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
其他代码
class Person implements Serializable{
private String name;
private Integer age;
private Address address;
public Person(String name, Integer age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Optional<Address> getAddress() {
return Optional.ofNullable(this.address);
}
public void setAddress(Address address) {
this.address = address;
}
}
class Address implements Serializable{
private Street street ;
public Optional<Street> getStreet() {
return Optional.ofNullable(this.street);
}
public void setStreet(Street street) {
this.street = street;
}
public Address(Street street) {
super();
this.street = street;
}
}
class Street implements Serializable{
private String streetName ;
private Integer streetNo;
public Street(String streetName, Integer streetNo) {
this.streetName = streetName;
this.streetNo = streetNo;
}
public String getStreetName() {
return streetName;
}
public void setStreetName(String streetName) {
this.streetName = streetName;
}
public Integer getStreetNo() {
return streetNo;
}
public void setStreetNo(Integer streetNo) {
this.streetNo = streetNo;
}
}

详解Java8 Optional类{最全}的更多相关文章
- 详解Java8的日期和时间API
详解Java8的日期和时间API 在JDK1.0的时候,Java引入了java.util.Date来处理日期和时间:在JDK1.1的时候又引入了功能更强大的java.util.Calendar,但是C ...
- 详解javascript的类
前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...
- CSS选择器详解(伪类) 转 http://blog.csdn.net/Panda_m/article/details/50084699
CSS选择器详解 之 伪类 伪类对大小写不敏感 结构伪类选择器 结构伪类是CSS3新增的类型选择器,利用DOM树实现元素过滤,通过文档结构的相互关系来匹配元素,可以减少class和id属性的定义,使文 ...
- 详解 QT 主要类 QWidget
QWidget类是所有用户界面对象的基类,每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. 先来看内容. AD: 2013云计算架构师 ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- 详解Java8特性之新的日期时间 API
详解Java8特性之新的日期时间 API http://blog.csdn.net/timheath/article/details/71326329 Java8中时间日期库的20个常用使用示例 ht ...
- OkHttp3源码详解(一) Request类
每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...
- struts2-环境搭建-访问流程-配置详解-常量配置-类详解
1 struts2概述 1.1 概念 1.2 struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以 ...
- Java泛型详解,史上最全图文详解!
泛型在java中有很重要的地位,无论是开源框架还是JDK源码都能看到它. 毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课. 一:泛型本质 Java 泛型(gen ...
随机推荐
- [Linux] linux下vim对于意外退出的文档的再次开启
转载自博客:https://blog.csdn.net/ljp1919/article/details/48372615 1.对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时, ...
- elasticsearch深度分页问题
elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.深度分页方式from + size es 默认采用的 ...
- CentOS 7上编写自定义系统审计规则
1)简介 Linux审计系统创建审计跟踪,这是一种跟踪系统上各种信息的方法.它可以记录大量数据,如事件类型,日期和时间,用户ID,系统调用,进程,使用的文件,SELinux上下文和敏感度级别.它可以跟 ...
- WordCount程序【Spark Streaming版本】
~~ 前置 ~~ Spark Streaming 常常对接 :本地文件.HDFS.端口.flume.kafka package february.streaming import org.apache ...
- Hive窗口函数最全案例详解
语法: 分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置) 常用分析函数: 聚合类 avg().sum().max(). ...
- 如何把安全证书导入到java中的cacerts证书库
每一步:进入某个https://www.xxx.com开头的网站,把要导入的证书下载, 在该网页上右键 >> 属性 >> 点击"证书" >> 再 ...
- eclipse快捷键——纪念我突然失忆的脑子
常用快捷键 1.快速new出来一个对象 Alt+/ 2.快速格式化代码 Ctrl+I 3.快速导入包 Ctrl+Shift+O
- mysql 最左前缀匹配原则
1.在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1.列col2和列col3建一个联合索引 KEY index_col1_co ...
- 从无到有,构建GIS + BIM大厦
声明:本文是一个系列原创(作者在GIS+BIM行业已有从业15年有余,还是个行业的小学生,文章内容不免有错误或者不当之处,敬请理解),旨在通过这个系列打造一个高性能,高可扩展的GIS+BIM框架,抛砖 ...
- 链表二:链表中倒数第k个结点
题目:链表中倒数第k个结点描述:输入一个链表,输出该链表中倒数第k个结点.解决方案:思路: 根据规律得出倒数第k个节点是 n-k+1个节点 方法一:先计算出链表的长度,在循环走到n-k+1步.(相当于 ...