Optional 容器类
什么是Optional容器类
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
Optional类常用方法:
Optional.of(T t) : 创建一个 Optional 实例。
Optional.empty() : 创建一个空的 Optional 实例。
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例。
isPresent() : 判断是否包含值。
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。
orElseThrow(Supplier es) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常。
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()。
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional。
filter(Predicate p):接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象。
示例:
import org.junit.Test;
import java.util.Optional;
/*
* Optional 容器类:用于尽量避免空指针异常
* Optional.of(T t) : 创建一个 Optional 实例
* Optional.empty() : 创建一个空的 Optional 实例
* Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
* isPresent() : 判断是否包含值
* ifPresent(Consumer<? super T> consumer) 判断是否包含值,再执行 consumer
* orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
* orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
* orElseThrow(Supplier<? extends X> exceptionSupplier) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常
* map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
* flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
* filter(Predicate<? super T> predicate):接收一个函数式接口,当符合接口时,则返回一个Optional对象,否则返回一个空的Optional对象
*
* map、flatMap 和 filter 的使用方法和 StreamAPI 中的一样
*/
public class TestOptional { /**
* 创建 Optional 实例
*/
@Test
public void test1(){ // Optional.empty() : 创建一个空的 Optional 实例
Optional<String> empty = Optional.empty();
System.out.println(empty);// 输出结果:Optional.empty
//System.out.println(empty.get());// 报错:java.util.NoSuchElementException: No value present // Optional.of(T t) : 创建一个 Optional 实例
Optional<Employee> eop = Optional.of(new Employee());
System.out.println(eop);// 输出结果:Optional[Employee{name='null', age=null, gender=null, salary=null, status=null}]
System.out.println(eop.get());//输出结果:Employee{name='null', age=null, gender=null, salary=null, status=null} //注意:Optional.of(T t) 中,传递给of()的值不可以为空,否则会抛出空指针异常
//Optional<Employee> eop1 = Optional.of(null);//这一行直接报错:java.lang.NullPointerException //Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
//所以,在创建Optional对象时,如果传入的参数不确定是否会为Null时,就可以使用 Optional.ofNullable(T t) 方式创建实例。
Optional<Object> op = Optional.ofNullable(null);//这样的效果和 Optional.empty() 一样
System.out.println(op);//Optional.empty
op = Optional.ofNullable(new Employee());//
System.out.println(op);//Optional[Employee{name='null', age=null, gender=null, salary=null, status=null}]
} /**
* isPresent() : 判断是否包含值
* ifPresent(Consumer<? super T> consumer) 判断是否包含值,再执行 consumer
*/
@Test
public void test2(){
Optional<Employee> opt = Optional.of(new Employee());
System.out.println(opt.isPresent());//输出结果:true
opt = Optional.ofNullable(null);
System.out.println(opt.isPresent());//输出结果:false
opt.ifPresent(employee -> System.out.println(employee));// 如果 opt.isPresent() 为false ,这里就不输出,否则就输出 employee
} /**
* orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
* orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
*/
@Test
public void test3(){
//Optional<Employee> opt = Optional.of(new Employee());
Optional<Employee> opt = Optional.ofNullable(null);
/*Employee emp = opt.orElse(new Employee("张三",20));
System.out.println(emp);*/ int condition = 2;//模拟条件
Employee emp = opt.orElseGet(()-> {
if (condition == 1){
return new Employee("李四");
}else if (condition == 2){
return new Employee("王二麻子");
}else {
return new Employee("赵六");
}
});
System.out.println(emp);
}
/**
* orElseThrow(Supplier<? extends X> exceptionSupplier) : 当遇到一个不存在的值的时候,并不返回一个默认值,而是抛出异常
*/
@Test
public void test4(){
Object obj = Optional.ofNullable(null).orElseThrow(IllegalArgumentException::new);//当参数为null,则抛出一个不合法的参数异常
System.out.println(obj);
} }
备注:map、flatMap 和 filter 的使用方法和 StreamAPI 中的一样,如需了解详细使用方法,请参考:Stream API 详解
Optional 容器类的更多相关文章
- java8 新特性 Optional容器类
public class Godness { private String name; public Godness() { } public Godness(String name) { this. ...
- Optional容器类
一.Optional 容器类:用于尽量避免空指针异常 方法 /* * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 O ...
- Java8新特性 - Optional容器类
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念.并且可以避免空指针异 ...
- java8 - Optional
mport java.util.Optional; import org.junit.Test; /* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) ...
- Java8新特性(三)——Optional类、接口方法与新时间日期API
一.Optional容器类 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. 查看结构图可以看到有如下常用方法: of(T)—— ...
- Java8——Optional
/* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 Op ...
- JDK1.8新特性之Optional
概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...
- 第十一章 容器类&新日期时间
11.1.Optional 容器类 11.1.1.概述 Optional 类是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional类 可以更好的表达这个概念 ...
- Java8的新特性--Optional
目录 Optional 一.Optional类是什么? 二.Optional类常用的方法 1. 创建Optional实例 1.1 Optional.of(T) 1.2 Optional.empty() ...
随机推荐
- Android_适配器(adapter)之ArrayAdapter
ArrayAdapter是一个很简单的适配器,是BaseAdapter的子类. ArrayAdapter绑定的数据是集合或数组,比较单一.视图是列表形式,ListView 或 Spinner. Arr ...
- Vue拖拽交换数据(非插件)
HelloWorld.vue 文件 <template> <div class="hello"> <h1>{{ msg }}</h1> ...
- Rocket - diplomacy - TransferSizes
https://mp.weixin.qq.com/s/Sf0owQxWzxacVvykJZ5oTQ 介绍TransferSizes的实现. 1. 基本定义 从min到max的闭合 ...
- 【Kafka】知识总结
Kafka是什么? Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. Kafka架构 1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对 ...
- doReleaseShared源码分析及唤醒后继节点的过程分析
文章结构 源码:对doReleaseShared()方法的源码进行一些注释 使用场景:介绍doReleaseShared()使用位置,及目的 以写锁开始的队列:分析写锁开始得同步等待队列在唤醒后续读锁 ...
- Java实现 蓝桥杯 算法提高 三进制数位和
算法提高 三进制数位和 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 给定L和R,你需要对于每一个6位三进制数(允许前导零),计算其每一个数位上的数字和,设其在十进制下为S. 一个 ...
- 第六届蓝桥杯JavaC组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.机器人数目 少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有: 6个轮子,3个传感器 C类含有 ...
- Java实现九阶数独
你一定听说过"数独"游戏. 如[图1.png],玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独 ...
- java实现黄金队列
** 黄金队列** 黄金分割数0.618与美学有重要的关系.舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子 ...
- java实现第七届蓝桥杯七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...