温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

CompletableFuture的thenApply和handle的区别是什么

发布时间:2021-09-14 15:00:55 来源:亿速云 阅读:287 作者:柒染 栏目:编程语言

这篇文章给大家介绍CompletableFuture的thenApply和handle的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

背景

1、在改造mybatis-r2dbc的过程中,要将结果返回为CompletableFutrue。<br/> 2、当查询单个字段信息且不包装为pojo类型时,是不能返回null对象的,因为sink.next方法不支持null对象。但实际场景是存在返回null的。<br/> 3、为规避sink.next不能返回null,故将null对象包装为一个自定义的枚举类。mybatis-r2dbc接收这个枚举对象后进行进一步处理,将枚举对象再转换为null返回。处理过程是在CompletableFuture.handleAsync方法进行。<br/>

问题

使用handleAsync处理返回null的问题确实可以解决sink.next不能返回null对象的问题。但是也引入了另一个问题,就是当底层驱动发生Exception的时候,返回的对象也是null,使用handleAsync处理后,异常会被吞噬掉,不能向外抛出。即使用handleAsync后,驱动的异常将全部被吞噬,返回数据为null,上层应用也无法感知到错误原因。

解决

将handleAsync方法替换为thenApplyAsync。

对比 thenApplyAsync和handleAsync

对比 thenApplyAsync和handleAsync的差异: thenApplyAsync是在当前stage正常完成后才会执行,如果有异常抛出则抛出异常不进入。所有以then开始的方法同此原理。 handleAsync无论是否异常抛出都会进入,并且返回结果不能够继续抛出异常。使用此方法将会吞噬上一阶段的异常。

关于CompletableFuture的thenApply和handle的区别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI