目录
5.ifPresent(Consumer consumer)
9. orElseThrow(Supplier exceptionSupplier)
11. filter(Predicate predicate)
前言
Optional 类(java.util.Optional) 是一个容器类
,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。有利于注意避免空指针异常的问题。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional容器类的常用方法及用法
1. Optional.of(T t)
创建一个Optional实例,如果 value 是 null,则抛出 NPE。
Optional<Employee> op = Optional.of(new Employee());
Employee emp = op.get();
// 会在null处直接发生空指针异常
Optional.of(null);
2. Optional.empty()
创建一个空的Optional实例
Optional<Employee> op = Optional.empty();
// 会发生空指针异常
System.out.println(op.get());
3. Optional.ofNullable(T t)
若 t 不为null,创建Optional实例,否则创建空实例
Optional<Employee> op = Optional.ofNullable(new Employee);
System.out.println(op.get());
Optional<Employee> op = Optional.ofNullable(null);
// op.get()会发生空指针
System.out.println(op.get());
4. isPresent()
判断是否包含值
Optional<Employee> op = Optional.ofNullable(null);
if(isPresent()) {
System.out.println(op.get());
}
-------------
或者写法:
if (status.isPresent()) {
System.out.println("Status: " + status.get());
}
//另一种简洁写法
status.ifPresent(System.out::println);
5.ifPresent(Consumer<? super T> consumer)
判断Optional
中是否有值,如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。否则什么都不干
6. get()
返回Optional
中包装的值,注意:在判空之前,千万不要直接使用!
首先,get()
不能直接使用,需要结合判空使用。这和!=null
其实没多大区别,只是在表达和抽象上有所改善。
7. orElse(T t)
如果调用对象包含值,返回该值,否则返回指定的t。
Optional<Employee> op = Optional.ofNullable(null);
Employee emp = op.orElse(new Employee());
8. orElseGet(Supplier s)
如果调用对象包含值,返回该值,否则返回s获取的值
Optional<Employee> op = Optional.ofNullable(null);
// 参数是函数式接口 可以写想要的逻辑
Employee emp = op.orElseGet(e -> new Employee());
9. orElseThrow(Supplier<? extends X> exceptionSupplier)
返回Optional
中包装的值,取不到值时抛出指定的异常。
10. map(Function f)
如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
Optional<Employee> op = Optional.ofNullable(new Employee());
Optional<String> str = op.map(e -> e.getName());
11. filter(Predicate<? super T> predicate)
过滤Optional
中的值,断言通过返回原值,否则返回empty()。
Optional<T> filter(Predicate<? super <T> predicate)
:如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
12. map(Function<? super T, ? extend U> mapper)
转换Optional
中的值。
13. flatMap(Function mapper)
与map类似,要求返回值必须是Optional
Optional<Employee> op = Optional.ofNullable(new Employee());
// flatMap返回值必须 用Optional包装一下
Optional<String> str = op.flatMap(e -> Optional.of(e.getName()));
System.out.println(str.get());
14.不要滥用
有些简单明了的方法,完全没必要增加Optional
来增加复杂性。
public String fetchStatus() {
String status = getStatus() ;
return Optional.ofNullable(status).orElse("PENDING");
}
//判断一个简单的状态而已
public String fetchStatus() {
String status = ... ;
return status == null ? "PENDING" : status;
}
首先,null 可以作为集合的元素之一,它并不是非法的;其次,集合类型本身已经具备了完整的空表达,再去包装一层Optional
也是徒增复杂,收益甚微。例如,如集合map 已经有了getOrDefault()
这样的类似orElse()
的 API 了。
总结
Optional
的出现使 Java 对 null 的表达能力更近了一步,好马配好鞍,合理使用可以避免大量的 NPE,节省大量的人力物力。