还在用if(obj!=)做非空判断?带你快速上手Optional实战性理解( 三 )

T orElseThrow(Supplier exceptionSupplier) throws X {if (value != ) {return value;} else {throw exceptionSupplier.get;}}复制代码实例:这个就贴实战源码了
//简单的一个查询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 {Optional findLocationById(String id);}复制代码然在是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 location = locationRepository.findLocationById(terminal.getLocationId);if (location.isPresent) {terminalVO.setFullName(location.get.getFullName);}return terminalVO;}//不要忘记抛出异常throw new ServiceException("该终端不存在");}复制代码实战场景还有很多 , 包括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的优化,我就不深入去说了 。
还在用if(obj!=)做非空判断?带你快速上手Optional实战性理解文章插图
之前 , 给大家发过三份Java面试宝典 , 这次新增了一份 , 目前总共是四份面试宝典 , 相信在跳槽前一个月按照面试宝典准备准备 , 基本没大问题 。