Optional类
Optional类概述
概述:Optional<T>类是Jdk1.8之后提供的一个容器类,Optional类的对象中可以存储或者接收一个其他的对象或者 数据
好处:
(1)可以更好的解决和处理对象的空指针异常
(2)支持函数型接口的使用和链式编程的开发方式
Optional类使用举例
public static void main(String[] args) {
Person p = new Person("张三",23);
//p = null;
//传统方式避免空指针异常,访问对象数据
if(p != null){
String name = p.getName();
if(name == "张三"){
System.out.println(p.toString());
}
}
//Optional类避免空指针异常访问数据
Optional.ofNullable(p).
filter(x -> x.getName() == "张三").ifPresent(System.out::println);
}
Optional类的常用方法
Method(方法) | Desc(描述) |
---|---|
Optional.of(T t) | 创建一个非空值的Optional实例 |
Optional.empty() | 创建一个空的Optional实例 |
Optional.ofNullable(T t) | 创建一个Optional实例,如果t值为null,返回一个空实例 |
isPresent() | 判断Optional实例中是否包含值 |
ifPresent(Consumer c) | 如果Optional实例中存在值,则按照参数处理该值,否则不执行任何操作 |
get() | 获取Optional实例中存储的值,否则抛出 NoSuchElementException |
orElse(T t) | 如果Optional实例包含值,则返回该值,否则返回参数 t |
orElseGet(Supplier s) | 如果Optional实例包含值,则返回该值,否则返回s中获取的值 |
orElseThrow(Supplier s) | 如果Optional实例为空,则返回自定义异常信息 |
filter(Predicate p) | 对Optional对象中的值判断,如果判断结果为true,则返回该值;否则返回空容器对象 |
map(Function f) | 如果Optional对象中有值,则通过参数对值处理,将处理之后的结果封装到一个新的Optional对象中返回;如果没有值,则返回一个空的Optional对象 |
flatmap(Function f) | 效果与功能与map相同,但是处理之后的数据需要自主封装到Optional对象中 |
Optional类方法演示
创建Optional实例
-
Optional.of(T t)
注意:因为Optional类构造被私有化,不能手动创建,只能获取
//获取一个对象
//获取的对象可能是从其他地方得来的,并不确定是否是null
Person p = new Person("张三",23);
//获取一个Optional容器对象,确定此对象不为null使用此方式
//若传入的地址为null,则抛出 NUllPointException
Optional<Person> opt1 = Optional.of(p);
- Optional.empty()
//获取一个没有值的空容器对象
Optional<Object> opt2 = Optional.empty();
- Optional.ofNullable(T t) 【常用】
//获取一个对象
//获取的对象可能是从其他地方得来的,并不确定是否是null
Person p = new Person("张三",23);
//获取一个Optinal容器对象,不确定传入的对象是否是空时使用此方法
//传入的对象可能不为Null,如果不为null则返回一个包含该值的容器对象
Optional<Person> opt3 = Optional.ofNullable(p);
//传入的对象可能为Null,如果为null则返回一个空容器对象
p = null;
Optional<Person> opt4 = Optional.ofNullable(p);
获取Optional中的值
-
get()
**注意:**传入的对象为null,抛出NoSuchElementException ,否则返回容器中的值
Person p = new Person("张三",23);
Optional<Person> opt = Optional.ofNullable(p);
//获取容器对象中的数据
Person p2 = opt.get();
Optional<Object> opt2 = Optional.ofNullable(null);
//容器对象中的对象为null,抛出 NoSuchElementException
Object o = opt2.get();
判断Optional中是否有值
-
isPresent()
**注意:**判断容器中的数据是否是空,如果为空就返回true,否则返回false
Person p = new Person("张三",23);
Optional<Person> opt = Optional.ofNullable(p);
if(opt.isPresent()){
System.out.println(opt.get());
}
消费Optional中的值
- ifPresent(Consumer c)
Person p = new Person("张三",23);
//如果Optional容器中有值,就值按照指定消费型接口的功能处理
//如果Optional容器中没有纸,就不做任何处理
Optional.ofNullable(p).ifPresent(System.out::println);
兜底函数
- orElse(T t)
注意:如果容器中有值就返回该值,否则返回 t
返回的是容器中的值,不是 Optional对象
Person p = new Person("张三",23);
//如果容器对象中有值,就返回该值,没有值就返回orElse参数中的值
Person p2 = Optional.ofNullable(p).orElse(new Person("李四", 24));
-
orElseGet(Supplier s)
**注意:**如果容器中有值就返回该值,否则返回供给型接口提供的值
返回的是容器中的值,不是Optional对象
Person p = new Person("张三",23);
//如果容器对象中有值,就返回该值,没有值就返回orElse参数中的值
Optional.ofNullable(p).orElseGet(()->new Person("李四",24));
以上两种方式区别:
当Optional对象中值为null时,都会执行参数中的内容
当Optional对象中值不为null时,orElse会继续执行参数内容,但是不会返回数据
orElseGet不会执行参数内容
- orElseThrow(Supplier s)
Person p = new Person("张三",23);
//如果Optional容器中传入的数据不为null,则返回改数据
Person p2 = Optional.ofNullable(p).orElseThrow(RuntimeException::new);
//如果Optional容器中传入的数据为null,就抛出参数中创建的异常
Optional.ofNullable(null).orElseThrow(RuntimeException::new);
过滤函数
-
filter(Predicate p)
**注意事项:**如果Optional中的数据不为null,且经过filter参数的判断方式为true,则返回该数据
否则返回空的Optional容器对象
Person p = new Person("张三",23);
Optional<Person> p2 = Optional.ofNullable(p).filter(x -> x.getName() == "张三");
System.out.println(p2);//张三,23
转换函数
-
map(Function f)
如果Optional容器中的数据不为null,则按照函数型接口的方式处理该数据,并返回一个新的数据
如果Optional容器中的数据为null,则返回一个空的Optional对象
**注意事项:**返回的是一个Optional对象
Person p = new Person("张三",23);
Optional<String> s = Optional.ofNullable(p).map(x -> x.getName());
System.out.println(s);//张三
-
flatmap(Function f)
如果Optional容器中的数据不为null,则按照函数型接口的方式处理该数据,并返回一个新的数据
如果Optional容器中的数据为null,则返回一个空的Optional对象
注意事项:
- 返回的是一个Optional对象
- 返回的Optional对象需要自主创建
Person p = new Person("张三",23);
Optional<String> s = Optional.ofNullable(p).flatMap(x -> Optional.ofNullable(x.getName()));
System.out.println(s);//张三
总结
- 可以实现链式编程,加强代码的可读性,可维护性,提升简洁度
- 可以在设计类型时,将一个对象类型的成员变量定义为Optional类型,加强对该变量的维护