Optional的使用

为什么使用?

使用它是为了避免代码中的 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也能执行

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值