溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CompletableFuture的thenApply和handle的區(qū)別是什么

發(fā)布時間:2021-09-14 15:00:55 來源:億速云 閱讀:277 作者:柒染 欄目:編程語言

這篇文章給大家介紹CompletableFuture的thenApply和handle的區(qū)別是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

背景

1、在改造mybatis-r2dbc的過程中,要將結果返回為CompletableFutrue。<br/> 2、當查詢單個字段信息且不包裝為pojo類型時,是不能返回null對象的,因為sink.next方法不支持null對象。但實際場景是存在返回null的。<br/> 3、為規(guī)避sink.next不能返回null,故將null對象包裝為一個自定義的枚舉類。mybatis-r2dbc接收這個枚舉對象后進行進一步處理,將枚舉對象再轉換為null返回。處理過程是在CompletableFuture.handleAsync方法進行。<br/>

問題

使用handleAsync處理返回null的問題確實可以解決sink.next不能返回null對象的問題。但是也引入了另一個問題,就是當底層驅動發(fā)生Exception的時候,返回的對象也是null,使用handleAsync處理后,異常會被吞噬掉,不能向外拋出。即使用handleAsync后,驅動的異常將全部被吞噬,返回數據為null,上層應用也無法感知到錯誤原因。

解決

將handleAsync方法替換為thenApplyAsync。

對比 thenApplyAsync和handleAsync

對比 thenApplyAsync和handleAsync的差異: thenApplyAsync是在當前stage正常完成后才會執(zhí)行,如果有異常拋出則拋出異常不進入。所有以then開始的方法同此原理。 handleAsync無論是否異常拋出都會進入,并且返回結果不能夠繼續(xù)拋出異常。使用此方法將會吞噬上一階段的異常。

關于CompletableFuture的thenApply和handle的區(qū)別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI