【Java】Optional 总结和使用

本文探讨了Spring Boot 2.5中findOne方法的变化,介绍了Optional在处理null值的重要性,展示了如何在实际开发中优雅地处理空值,并提供了常见操作方法实例。升级到新版本或使用新框架时,Optional有助于提升代码健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🎪/背景

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👨🏼‍🍳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值