为什么使用?
使用它是为了避免代码中的 if (obj != null) { } 这样范式的代码,可以采用链式编程的风格
介绍
构造函数:
- Optional.of(obj): 它要求传入的 obj 不能是 null 值的, 否则直接报 NullPointerException
异常。 - Optional.ofNullable(obj): 它以一种智能的, 宽容的方式来构造一个 Optional 实例. 来者不拒, 传
null 进到就得到 Optional.empty(), 非 null 就调用 Optional.of(obj). - Optional.empty():返回一个空的 Optional 对象
方法列表:
- public Optional map(Function<? super T, ? extends U> mapper),将 Optional 中的对象转成 其他对象,或者修改对象中的属性
- public Optional flatMap(Function<? super T, Optional> mapper),将 Optional 中的对象转成 Optional 对象,或者修改对象中的属性
- public T orElse(T other): 在构造 Optional 的时候,如果其中的对象为 null, 通过 orElse方法可以给定一个默认值
- public T orElseGet(Supplier<? extends T> other):在构造 Optional的时候,如果其中的对象为 null, 通过 orElseGet 方法可以动态构造一个对象;与 orElse 相比,orElseGet的参数是 Supplier 接口对象
- public void ifPresent(Consumer<? super T> consumer):ifPresent 表示Optional 中的对象存在才会执行 Consumer 接口对象中的方法
- public Optional filter(Predicate<? super T> predicate):Optional中的对象在不为空,并且满足某个条件的时候才会返回
- public T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X:在使用 Optional 包装的对象前,如果对象为 null 抛出自定义的异常
使用:
orElse方法:
将user2的name赋值给user的name
//不使用Optional写法
if (user2.getName()!=null){
user.setName(user2.getName());
}else {
user.setName("默认姓名");
}
//Optional写法
user.setName(Optional.ofNullable(user2.getName()).orElse("默认姓名"));
orElseGet方法:和orElse类似,只不过参数不一样
同样是将user2的name赋值给user的name
//Optional写法,两种写法
//里面写方法
user.setName(Optional.ofNullable(user2.getName()).orElseGet(()->getName()));
private String getName(){
return "默认姓名";
}
//里面直接写函数
user.setName(Optional.ofNullable(user2.getName()).orElseGet(()->{
return "默认姓名";
}));
orElseThrow方法:
同样是将user2的name赋值给user的name
//Optional写法
user.setName(Optional.ofNullable(user2.getName())
.orElseThrow(()->new NullPointerException()));
ifPresent方法:
比如列表经常用到的条件搜索功能
QueryWrapper<PjjhDdqkVo> queryWrapper = new QueryWrapper<>();
//传统写法
if(wbddyPqQueryVo.getBgb141()!=null) {
queryWrapper.eq("bgb141", wbddyPqQueryVo.getBgb141());
}
//Optional写法
Optional.ofNullable(wbddyPqQueryVo.getBgb141()).ifPresent(s->{
queryWrapper.eq("bgb141", wbddyPqQueryVo.getBgb141());
});
注意:Optional.ofNullable是不判断空字符串的,如果wbddyPqQueryVo.getBgb141()是空字符串,ifPresent也能执行