CompletableFuture的thenApply和handle的区别是什么

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

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册、虚拟空间、营销软件、网站建设、房山网站维护、网站推广。

背景

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

问题

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

解决

将handleAsync方法替换为thenApplyAsync。

对比 thenApplyAsync和handleAsync

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

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


网站名称:CompletableFuture的thenApply和handle的区别是什么
本文链接:http://myzitong.com/article/jipggj.html