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() ...
随机推荐
- Verilog代码和FPGA硬件的映射关系(五)
既然我们可以指定寄存器放在IOB内,那我们同样也可以指定PLL的位置.首先要确保我们有多个PLL才行.如图1所示,我们所使用的EP4CE10F17C8芯片刚好有两个. 图 1 为了演示这个例子,我们使 ...
- 发光加载环动画-纯CSS动画效果-如何创建CSS3旋转预加载器(参照https://www.bilibili.com/video/BV1V4411C7z5?from=search&seid=9741275927942612817)
//css部分 body{ margin:; padding:; background: #262626; } .ring{ position: absolute; top:50%; left: 50 ...
- MySQL 5.7.30 的安装/升级(所有可能的坑都在这里)
楔子 由于之前电脑上安装的MySQL版本是比较老的了,大概是5.1的版本,不支持JSON字段功能.而最新开发部门开发的的编辑器产品,使用到了JSON字段的功能. 因此需要升级MySQL版本,升级的目标 ...
- [PHP学习教程 - 网络]003.获得当前访问的页面URL(Current Request URL)
引言:获取当前请求的URL路径,自动判断协议(HTTP or HTTPS). 一句话的事情,下面直接上高清无MSK的精妙代码! 功能函数 获得当前请求的页面路径(URL)地址 语法:$url = ge ...
- Linux、Ubuntu、CentOS安装和配置zsh
目录 01 zsh的安装 02 配置zsh 2.1 安装oh-my-zsh 2.2 查看oh-my-zsh目录 2.3 oh-my-zsh 插件的管理 2.3.1 添加插件 2.3.2 zsh-aut ...
- scikit-learn中文文档
http://sklearn.apachecn.org/cn/0.19.0/tutorial/statistical_inference/supervised_learning.html
- 01 . Keepalived原理使用和配置
Keepalived简介 是什么? keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层.第4层和第5层交换.Keepalived的作用是检测we ...
- Rocket - util - Annotations
https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg 介绍util中定义的注解(Annotations). 1. Annotation ...
- 快速搭建Spring Boot + Apache Shiro 环境
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.Apache Shiro 介绍及概念 概念:Apache Shiro是一个强大且易用的Java安全框 ...
- Java实现 蓝桥杯VIP 算法提高 聪明的美食家
算法提高 聪明的美食家 时间限制:1.0s 内存限制:256.0MB 问题描述 如果有人认为吃东西只需要嘴巴,那就错了. 都知道舌头有这么一个特性,"由简入奢易,由奢如简难"(据好 ...