共计 1230 个字符,预计需要花费 4 分钟才能阅读完成。
项目的 springboot
版本总算从 1.x 升级到了 2.x, 作为一个不算小的项目,这个过程想想就觉得恐怖,整个升级过程差不多花了潘老师一周时间,感谢潘老师的辛苦付出。
既然版本升级了怎么能不试试 spring boot2
的新特性呢?而新特性里的 optional
无疑是最方便尝试的,不过平时也就只能试试其中 orelseThrow
如果前面获取到的 optional
里面的东西是空的话,就会抛出后面的异常。这个运行的很好,和字面意思一样。前段时间潘老师提到了一个需求:通过部门 id 查找部门详情,如果有就返回原来的,没有就新建一个返回,当时就感觉这很适合 Optional
的 orelse。
代码写好
/**
* Description: 通过部门 id 查找部门详情
* Author: liyiheng
*
* @param id 部门 id
* @return 对应的部门详情
*/
@Override
public DepartmentDetail getByDepartmentId(Long id) {
……
……
return departmentDetailRepository.findByDepartment(department)
.orElse(departmentDetailRepository.save(new DepartmentDetail(department)));
}
测试写好
```
@Test
public void getByDepartmentId() {
……
……
logger.debug("当通过部门找不到部门时,会有一个新部门");
Department department1 = new Department();
department1 = departmentRepository.save(department1);
departmentDetail = departmentDetailService.getByDepartmentId(department1.getId());
Assertions.assertThat(departmentDetail).isNotNull();}
```
运行通过,提交代码。## 报错了?第二天上完课一回来,就说我给他挖坑了……把我弄得一脸蒙蔽,我干啥了?说了半天才明白,我的方法写的有问题,但我的单元测试明明过了呀,我开始还有点不信,但是前台一调……嗯,确实有问题
第一次访问没问题,第二次访问时就会报 500,报错信息显示这个查询无法返回两个不同的结果,咋会有两个,我啥时候加的,真相只有一个,orelse
在不空的情况下也执行了。网上查理一下果然如此,我只想说这方法名起的真不好。
orelse 与 orelseGet
用一句话形容一下他两的区别:当 Optonal 的值是空值时,无论 orElse 还是 orElseGet 都会执行;而当返回的 Optional 有值时,orElse 会执行,而 orElseGet 不会执行。
引用一位网友的解释
参考文章
Optional 的 orElse 和 orElseGet 区别
正文完
发表至:无分类
2019-08-31