当前位置: 首页 > 工具软件 > Optional > 使用案例 >

Optional的使用

韦昊焜
2023-12-01

为什么使用?

使用它是为了避免代码中的 if (obj != null) { } 这样范式的代码,可以采用链式编程的风格

介绍

构造函数:

  1. Optional.of(obj): 它要求传入的 obj 不能是 null 值的, 否则直接报 NullPointerException
    异常。
  2. Optional.ofNullable(obj): 它以一种智能的, 宽容的方式来构造一个 Optional 实例. 来者不拒, 传
    null 进到就得到 Optional.empty(), 非 null 就调用 Optional.of(obj).
  3. Optional.empty():返回一个空的 Optional 对象

方法列表:

  1. public Optional map(Function<? super T, ? extends U> mapper),将 Optional 中的对象转成 其他对象,或者修改对象中的属性
  2. public Optional flatMap(Function<? super T, Optional> mapper),将 Optional 中的对象转成 Optional 对象,或者修改对象中的属性
  3. public T orElse(T other): 在构造 Optional 的时候,如果其中的对象为 null, 通过 orElse方法可以给定一个默认值
  4. public T orElseGet(Supplier<? extends T> other):在构造 Optional的时候,如果其中的对象为 null, 通过 orElseGet 方法可以动态构造一个对象;与 orElse 相比,orElseGet的参数是 Supplier 接口对象
  5. public void ifPresent(Consumer<? super T> consumer):ifPresent 表示Optional 中的对象存在才会执行 Consumer 接口对象中的方法
  6. public Optional filter(Predicate<? super T> predicate):Optional中的对象在不为空,并且满足某个条件的时候才会返回
  7. 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也能执行

 类似资料: