第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在另一個(gè)CompletableFuture的結(jié)果上應(yīng)用多個(gè)CompletableFuture

在另一個(gè)CompletableFuture的結(jié)果上應(yīng)用多個(gè)CompletableFuture

溫溫醬 2021-05-26 09:13:50
讓我們舉一個(gè)例子:我們有四種方法:CompletableFututre<Void> loadAndApply(SomeObject someObject);CompletableFuture<SomeData> loadData();A processA(SomeData data);B processB(SomeData data);loadAndApply結(jié)合了所有其他方法。loadData長時(shí)間獲取數(shù)據(jù)。然后我們將設(shè)置someObject.A為運(yùn)行的結(jié)果,processA(data)并將其設(shè)置someObject.B為運(yùn)行的結(jié)果。processB(data) 我們不能同時(shí)應(yīng)用這兩者processA,processB因?yàn)閜rocessA它們只能在上運(yùn)行,swingExecutor并且processB只能在上運(yùn)行backgroundExecutor。所以我的問題是:我們可以以某種美觀的方式將所有這些方法鏈接起來嗎?目前,我像這樣啟動(dòng)它們:CompletableFututre<Void> loadAndApply(SomeObject someObject) {    return loadData()      .thenApplyAsync(data -> { someObject.setA(processA(data)); return data; }, swingExecutor)      .thenAcceptAsync(data -> someObject.setB(processB(data)), backgroundExecutor);}有什么方法看起來比applyAsync實(shí)際上不對(duì)給定對(duì)象應(yīng)用任何東西,只是將其返回給下一個(gè)未來更好嗎?
查看完整描述

1 回答

?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊

您可以CompletionStage.thenCompose(Function)與結(jié)合使用CompletableFuture.allOf(CompletableFuture...)。由所Function使用的通用簽名thenCompose為:Function<? super T, ? extends CompletionStage<U>>。


public CompletableFuture<Void> loadAndApply(SomeObject object) {

  return loadData().thenCompose(data ->

      CompletableFuture.allOf(

          CompletableFuture.runAsync(() -> object.setA(processA(data)), swingExecutor),

          CompletableFuture.runAsync(() -> object.setB(processB(data)), backgroundExecutor)

      ) // End of "allOf"

  ); // End of "thenCompose"

} // End of "loadAndApply"

這有一個(gè)額外的好處。在您當(dāng)前正在使用的thenAcceptAsync階段的代碼中,必須等待thenApplyAsync階段完成才能執(zhí)行。當(dāng)同時(shí)使用以上兩者時(shí)setA,它們setB將在各自的執(zhí)行程序中同時(shí)運(yùn)行。


為了方便起見,以下是Javadoc allOf:


返回一個(gè)新的CompletableFuture,當(dāng)所有給定的CompletableFutures完成時(shí)就完成。如果給定的CompletableFuture中的任何一個(gè)異常完成,則返回的CompletableFuture也會(huì)執(zhí)行此操作,并且CompletionException會(huì)將此異常作為其原因。否則,給定CompletableFuture的結(jié)果(如果有)不會(huì)反映在返回的CompletableFuture中,而是可以通過單獨(dú)檢查來獲得。如果未提供CompletableFuture,則返回一個(gè)CompletableFuture,其值為null。


在繼續(xù)執(zhí)行程序之前,此方法的應(yīng)用程序是等待一組獨(dú)立的CompletableFutures的完成,例如:CompletableFuture.allOf(c1,c2,c3).join();。


...以及Javadoc用于thenCompose:


返回一個(gè)新的CompletionStage,該值以與給定函數(shù)返回的CompletionStage相同的值完成。


當(dāng)此階段正常完成時(shí),將使用該階段的結(jié)果作為參數(shù)來調(diào)用給定函數(shù),并返回另一個(gè)CompletionStage。當(dāng)該階段正常完成時(shí),此方法返回的CompletionStage將使用相同的值完成。


為了確保進(jìn)度,提供的功能必須安排其結(jié)果的最終完成。


此方法類似于Optional.flatMap和Stream.flatMap。


有關(guān)涵蓋異常完成的規(guī)則,請(qǐng)參閱CompletionStage文檔。


注意:CompletableFuture,它實(shí)現(xiàn)了CompletionStage,thenCompose但會(huì)覆蓋,但使返回類型更具體(returnCompletableFuture而不是CompletionStage)。


查看完整回答
反對(duì) 回復(fù) 2021-05-26
  • 1 回答
  • 0 關(guān)注
  • 126 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)