详解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 ...
随机推荐
- Java 截取字符串中指定数据及之后数据
String resCallBackJson="12556{1{{{456858585{"; resCallBackJson = resCallBackJson.su ...
- go语言 链表练习
package main import "fmt" //定义节点 type Node struct { Data int Next *Node } /* * 返回第一个节点 * h ...
- 【linux】【jenkins】自动化运维三 整合gitlab、docker发布vue项目
由于工作需要,这里我先创建一个vue的工程. 1.首先安装好gitlab相关插件:GitLab.GitLab Hook.NodeJS 插件安装参考:https://www.cnblogs.com/jx ...
- 【linux】【jenkins】自动化部署一 安装jenkins及Jenkins工作目录迁移
系统环境:Centos7 https://jenkins.io/zh/download/ 下载对应系统的jenkins 一.安装jdk8.0 jenkins安装需要jdk8or11,根据jenkins ...
- jmeter入门(环境搭建&运行&初识)
最近了解了一些性能测试的基础知识和原理决定动手实践下,比较选择了jmeter 一.什么是jmeter Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试 ...
- 2018年蓝桥杯ava b组第一题
第一题.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容 如果问我怎么做的,我就是看日历做的,看了 ...
- 暑期——第八周总结(1,安装好hadoop之后访问http://localhost:50070,无法连接【已解决】 2,Hbase命令详解)
所花时间:7天 代码行:800(Java) 博客量:1篇 了解到知识点 : 一:http://localhost:50070无法访问 安装好hadoop之后 输入所有东西都有 可就是访问50070无法 ...
- Dubbo学习系列之八(分布式事务之MQ方案)
自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...
- Centeos7部署Flask+Gunicorn+nginx
一.环境安装 pip3 install flask pip3 install gunicorn pip3 install nginx 二.模块介绍 1.Flask是一个使用 Python 编写的轻量级 ...
- ORM增删改查
目录 orm django 连接mysql顺序 1 settings配置文件中 2 项目文件夹下的init文件中写上下面内容, 补充 3 models文件中创建一个类(类名就是表名) 4.执行数据库同 ...