【Java】Optional 总结和使用

🎪/背景

springboot data jpa 版本在 之前1.5x的是findOne 通过主键查询一条数据

而在2.5里面 findOne 是查询符合条件的一条数据,主键查询又改回findById

而且findById 不直接返回实体对象了,而是Optional<实体对象>对象

Optional对象是jdk1.8以后才支持,所以要使用jpa2.5x需要至少jdk1.8或以上。

🎃/ 问题:什么是Optional

Optional主要是针对null值处理

也就是所有程序中最常见的异常,空指针异常

(null没有任何属性和方法,任何调用他的属性都会报错
,而任何对象都可能是null,编译器无法确定变量的值是否为null而做出提示 =,=)

Optional就是专门处理null值的,对于任何可能为null的值,都可以包装起来,方便对空值情况处理,避免大量的==null, !=null 潘墩,程序更加的优美了,能有效的避免了对象为空的情况(因为别人给你的接口就是返回的 Optional)。

🎡 / 常见的使用方法

之前我就知道Optional,但是实际开发中基本不用 (狗头-,-)

因为我原来的工程直接返回的就是基本对象,大部分的程序员都还没有使用Optional的习惯,你不一定能说服所有人(-,-)
而且代码改动是一件麻烦的事情,容易出问题,而且工作量很大

但是当框架已经使用这样的结构之后,你不得不去适应的时候,你可以发现你的程序的健壮性大大提升了,而且真正的使用过后发现真香。🧜‍♀️(+_+ 而且新项目直接使用就不会有上述的问题)

先给个示例方法调用

//查询用户
Optional<UserDO> userOptional = userRepository.findById(param.getUserId());

1、对空值做异常处理的,拿到对象的(常用)

 UserDO userDO = userOptional.orElseThrow(() ->
                ViewCodeUtils.toException(ViewResultCodeEnum.USER_NOT_EXIST)
                );

自带的抛出异常的处理机制,返回异常对象即可

上面我使用了枚举异常,最后返回的是异常对象,和下面的效果一致。

 UserDO userDO = activeOptional.orElseThrow(() ->
                new RuntimeException("用户不存在"));

等同于原来的代码

if(user == null){
 throw new RuntimeException("用户不存在");
}

2、只处理有值的,对空值不处理,使用ifPresent即可

userOptional.ifPresent(p-> System.out.println(p.getActivityId()));

如果为空则不会执行,一般数据筛选的时候可以用。

等同于原来的代码

if(user != null){
	System.out.println(user.getActivityId())
}

3、空值判断,isPresent,存在则返回true

if (!userOptional.isPresent()){
            throw ViewCodeUtils.toException(ViewResultCodeEnum.USER_NOT_EXIST);
}
 UserDO userDO = userOptional.get();

查看源码,实现非常简单。就是为了避免直接写==null!=null
(据说是因为有些人 少写了一个=号,变成了 user = null,所以有些写法推荐为 null == user,当然还是不推荐写 ==

//源码
public boolean isPresent() {
        return value != null;
    }

判读为空的处理之后就可以通过.get()获取值,那可能会问了,我就喜欢==null判断,能拿出来再处理么?我们看下源码

//源码
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

很明显,为了让你用提供的方法,是不会让你先把值拿出来的,这样就失去了这个类的意义。所以还是要先判空处理哦。

4、空值则补全

UserDO userDO = userOptional.orElse(new UserDO());

这个方法不常用,因为你将无法区分这个对象是你原本的还是你创建出来的(除非你不在乎它的来源,或者其他作用)

当然你可以在你创建的对象上做一点手脚,比如某个字段标记为自动创建,但是你需要单独一个字段去维护,当然如果你不需要区分的时候,是个不错的方法。

👓 /总结

Optional是避免空值而生的对象,对空值的情况提供了对应的现成的解决方案,避免手写空判断导致的问题,可能开始的时候不习惯,你需要有使用的环境,比如升级jpa的版本到2.5x,或者其他的框架升级下版本,可能就会提供给你Optional,使用的方法也非常简单,相信都写一遍就能快速掌握。

总结一下常用的方法,给需要学习的人节约时间,biu👨🏼‍🍳

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java OptionalJava 8 引入的一个类,用于解决经常出现的空指针异常。它的设计初衷是希望提供一种简洁的方式来处理可能为空的对象。 然而,Optional 也存在一些错误的用法,下面列举了一些常见的错误用法: 1. 非必要地使用 Optional:有些开发者过度使用 Optional,把所有的对象都包装成 Optional,这样会导致代码变得复杂且难以理解。只有当对象确实可能为空时,才应考虑使用 Optional。 2. 错误的使用 ifPresent 方法:ifPresent 方法用于判断 Optional 对象是否有值,如果有值则执行指定的方法。有些开发者错误地使用 ifPresent 方法来执行一些复杂的逻辑,这样会导致代码变得混乱。正确的做法是使用 map 或 flatMap 方法来进行链式操作。 3. 对空值的处理不当:如果没有正确处理 Optional 对象为空的情况,仍然会导致空指针异常的发生。应该使用 isPresent 方法或者使用 orElseThrow 方法来处理空值的情况。 4. 对 Optional 对象的滥用:有些开发者滥用 Optional 对象,把 Optional 当作方法的返回类型,这样会增加方法的复杂性,并且会误导调用者。正确的做法是根据具体情况判断是否需要使用 Optional总结来说,Java Optional 是一种处理可能为空对象的有效方式,但是需要注意一些错误的用法。我们应该根据具体情况,合理使用 Optional,并且避免过度使用 Optional,以及注意处理空值的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值