还在用if(obj!=)做非空判断?带你快速上手Optional实战性理解( 三 )
//简单的一个查询Member member = memberService.selectByPhone(request.getPhone);Optional.ofable(member).orElseThrow( -> new ServiceException("没有查询的相关数据"));复制代码
2.11 相似方法进行对比分析可能小伙伴看到这 , 没用用过的话会觉得orElse和orElseGet还有orElseThrow很相似 , map和flatMap好相似 哈哈哈不用着急 , 都是从这一步过来的 , 我再给大家总结一下不同方法的异同点 orElse和orElseGet和orElseThrow的异同点
方法效果类似 , 如果对象不为空 , 则返回对象 , 如果为空 , 则返回方法体中的对应参数 , 所以可以看出这三个方法体中参数是不一样的 orElse(T 对象) orElseGet(Supplier < T >对象) orElseThrow(异常)
map和orElseGet的异同点
方法效果类似 , 对方法参数进行二次包装 , 并返回,入参不同 map(function函数) flatmap(Optional< function >函数)
具体要怎么用 , 要根据业务场景以及代码规范来定义 , 下面可以简单看一下我在实战中怎用使用神奇的Optional
3.实战场景再现场景1:在service层中 查询一个对象 , 返回之后判断是否为空并做处理
//查询一个对象Member member = memberService.selectByIdNo(request.getCertificateNo);//使用ofable加orElseThrow做判断和操作Optional.ofable(member).orElseThrow( -> new ServiceException("没有查询的相关数据"));复制代码
场景2:我们可以在dao接口层中定义返回值时就加上Optional 例如:我使用的是jpa , 其他也同理
public interface LocationRepository extends JpaRepository
然在是Service中
public TerminalVO findById(String id) {//这个方法在dao层也是用了Optional包装了Optional terminalOptional = terminalRepository.findById(id);//直接使用isPresent判断是否为空if (terminalOptional.isPresent) {//使用get方法获取对象值Terminal terminal = terminalOptional.get;//在实战中 , 我们已经免去了用set去赋值的繁琐 , 直接用BeanCopy去赋值TerminalVO terminalVO = BeanCopyUtils.copyBean(terminal, TerminalVO.class);//调用dao层方法返回包装后的对象Optional
实战场景还有很多 , 包括return时可以判断是否返回当前值还是跳转到另一个方法体中 , 什么的还有很多 , 如果大家没有经验的小伙伴还想进行学习 , 可以评论一下我会回复大家
4.Optional使用注意事项Optional真么好用 , 真的可以完全替代if判断吗?我想这肯定是大家使用完之后Optional之后可能会产生的想法 , 答案是否定的举一个最简单的栗子:例子1:如果我只想判断对象的某一个变量是否为空并且做出判断呢?
Person person=new Person;person.setName("");persion.setAge(2);//普通判断if(StringUtils.isNotBlank(person.getName)){//名称不为空执行代码块}//使用Optional做判断Optional.ofable(person).map(p -> p.getName).orElse("name为空");复制代码
我觉得这个例子就能很好的说明这个问题 , 只是一个很简单判断 , 如果用了Optional我们还需要考虑包装值 , 考虑代码书写 , 考虑方法调用 , 虽然只有一行 , 但是可读性并不好 , 如果别的程序员去读 , 我觉得肯定没有if看的明显
5.jdk1.9对Optional优化首先增加了三个方法: or、ifPresentOrElse 和 stream 。 or与orElse等方法相似 , 如果对象不为空返回对象 , 如果为空则返回or方法中预设的值 。 ifPresentOrElse方法有两个参数:一个 Consumer 和一个 Runnable 。 如果对象不为空 , 会执行 Consumer 的动作 , 否则运行 Runnable 。 相比ifPresent多了OrElse判断 。 **stream**将Optional转换成stream , 如果有值就返回包含值的stream , 如果没值 , 就返回空的stream 。
因为这个jdk1.9的Optional具体我没有测试 , 同时也发现有蛮好的文章已经也能让大家明白jdk1.9的option的优化,我就不深入去说了 。
文章插图
之前 , 给大家发过三份Java面试宝典 , 这次新增了一份 , 目前总共是四份面试宝典 , 相信在跳槽前一个月按照面试宝典准备准备 , 基本没大问题 。
- 看不上|为什么还有用户看不上华为Mate40系列来看看内行人怎么说
- 麒麟|荣耀新款,麒麟810+4800万超清像素,你还在犹豫什么呢?
- 国产手机|国产手机新品频发,果粉们你们还能忍得住吗?
- 无国界|嘴上说着支持华为,却为苹果贡献了2000亿!还真是科技无国界啊?
- 减重|快看!奇瑞蚂蚁都减重了 那你还焦虑什么?
- 二维码|村网通?澳大利亚一州推出疫情追踪二维码 还考虑采用人脸识别和地理定位
- 手机|iPhone12 Pro居然比mini还好卖?网友:24期免息起作用了!
- 拍照|iPhone12还没捂热13就曝光了,屏幕、信号、拍照均有升级!
- 屏幕|苹果iPhone12屏幕不仅发白,还绿的你发慌,用户:环保绿
- 月入|一上网,感觉网上每个人都是月入过万,到底是错觉还是你out了?