什么是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 容器类的更多相关文章

  1. java8 新特性 Optional容器类

    public class Godness { private String name; public Godness() { } public Godness(String name) { this. ...

  2. Optional容器类

    一.Optional 容器类:用于尽量避免空指针异常 方法 /* * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 O ...

  3. Java8新特性 - Optional容器类

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念.并且可以避免空指针异 ...

  4. java8 - Optional

    mport java.util.Optional; import org.junit.Test; /* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) ...

  5. Java8新特性(三)——Optional类、接口方法与新时间日期API

    一.Optional容器类 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. 查看结构图可以看到有如下常用方法: of(T)—— ...

  6. Java8——Optional

    /* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 Op ...

  7. JDK1.8新特性之Optional

    概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...

  8. 第十一章 容器类&新日期时间

    11.1.Optional 容器类 11.1.1.概述 Optional 类是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional类 可以更好的表达这个概念 ...

  9. Java8的新特性--Optional

    目录 Optional 一.Optional类是什么? 二.Optional类常用的方法 1. 创建Optional实例 1.1 Optional.of(T) 1.2 Optional.empty() ...

随机推荐

  1. 一元三次方程组求解 luogu P1024

    题目传送门 首先,要明确题目信息,f(x1) * f(x2) < 0, 则一定存在实数根在区间(x1, x2).且所有的根都在[-100, 100)之间.根与根的绝对值之差 >= 1 那么 ...

  2. [Axure教程]0005.系统函数与变量介绍

    1.变量的种类: [1].全局变量:可以在整个原型的任意位置调用和修改. [2].局部变量:仅作用于某一事件的某一动作内. [3].自定义变量:自行新建的全局变量. 2.Axure函数: [1].特殊 ...

  3. [Wireshark]_003_电子邮件抓包分析

    电子邮件是我们的生活工作中经常使用的一种服务,用来联系世界各地的朋友,客户.下面我们就用Wireshark对电子邮件进行抓包. 准备工作: 邮件客户端一款(Outlook,Foxmail,KooMai ...

  4. Vue拖拽交换数据(非插件)

    HelloWorld.vue 文件 <template> <div class="hello"> <h1>{{ msg }}</h1> ...

  5. 15 . PythonWeb框架本质

    PythonWeb框架的本质 简单描述就是:浏览器通过你输入的网址给你的socket服务端发送请求,服务端接受到请求给其回复一个对应的html页面,这就是web项目.所有的Web应用本质上就是一个so ...

  6. 解决SpringBoot在后台接收前台传递对象方式

    问题描述 前台传递对象,不管是通过ajax请求方式,还是axios请求方式.后台应该怎么接收对象处理呢? 比如前台传递 ajax方式: $.ajax({ url: "后台的方式", ...

  7. Java实现 蓝桥杯 基础练习 杨辉三角形

    基础练习 杨辉三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质 ...

  8. Java实现 LeetCode 328 奇偶链表

    328. 奇偶链表 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂 ...

  9. Java实现 LeetCode 313 超级丑数

    313. 超级丑数 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7, ...

  10. Java中System的详细用法

    System.arraycopy System.arraycopy的函数原型是: public static void arraycopy(Object src, int srcPos, Object ...