orelse,否则的话?

项目的 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();

}

```

运行通过,提交代码。

##报错了?
第二天上完课一回来,就说我给他挖坑了……把我弄得一脸蒙蔽,我干啥了?说了半天才明白,我的方法写的有问题,但我的单元测试明明过了呀,我开始还有点不信,但是前台一调……嗯,确实有问题

orelse,否则的话?

第一次访问没问题,第二次访问时就会报500,报错信息显示这个查询无法返回两个不同的结果,咋会有两个,我啥时候加的,真相只有一个, orelse 在不空的情况下也执行了。网上查理一下果然如此,我只想说这方法名起的真不好。

orelse与orelseGet

用一句话形容一下他两的区别: 当Optonal的值是空值时,无论orElse还是orElseGet都会执行;而当返回的Optional有值时,orElse会执行,而orElseGet不会执行。

引用一位网友的解释

orelse,否则的话?

原文 

https://segmentfault.com/a/1190000020245179

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » orelse,否则的话?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址