详解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 ...
随机推荐
- 使用Nexus3搭建Maven私服
1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...
- WordPress对接微信小程序遇到的问题
1.文章内容中的“<”和“>”字符显示问题 小程序是使用“wxPares工具来实现html转wxml的,如果你的文本包含了代码比如xml会携带<>符号,程序会将其转化,造成解析 ...
- Hadoop-1,web页面调用报无hbase.jar包【以解决】 2,报java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem;【以解决】
1:web页面调用报无hbase.jar包 本来java文件就没有问题,但是jsp一调用那个java文件里的方法就报错,报的无hadoop/hbase相关报的问题. 主要解决方法是: 复制hbase/ ...
- 【深度学习】Focal Loss 与 GHM——解决样本不平衡问题
Focal Loss 与 GHM Focal Loss Focal Loss 的提出主要是为了解决难易样本数量不平衡(注意:这有别于正负样本数量不均衡问题)问题.下面以目标检测应用场景来说明. 一些 ...
- vue知识点整理
1.对于mvvm的理解 mvvm是model-view-viewModel vue是以数据为驱动的,vue自身将dom和数据进行绑定,一旦创建绑定,dom和数据将保持同步,每当数据发生变化,dom也会 ...
- asp.net core IdentityServer4 实现 implicit(隐式许可)实现第三方登录
前言 OAuth 2.0默认四种授权模式(GrantType) 授权码模式(authorization_code) 简化模式(implicit) 密码模式(resource owner passwor ...
- 基于操作系统原理的Linux 的用户管理
一.实验目的 1.掌握为root用户修改密码的方法. 2.掌握创建新用户的方法. 3.掌握用户组的管理方法. 4.掌握为用户授权的方法. 二.实验内容 1.Linux的用户管理 (1)创建新用户创建新 ...
- 12.Django基础十之Form和ModelForm组件
一 Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户 ...
- JAVA 8 新特性Stream初体验
什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 <strong元素队列< strong="">元素是特定类型的对象,形成一个队 ...
- TensorFlow基本计算单元与基本操作
在学习深度学习等知识之前,首先得了解著名的框架TensorFlow里面的一些基础知识,下面首先看一下这个框架的一些基本用法. import tensorflow as tf a = 3 # Pytho ...