日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

返回CompletableFuture:Java 8功能亮点

發(fā)布時(shí)間:2023/12/3 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 返回CompletableFuture:Java 8功能亮点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CompletableFuture與未來(lái):與Java 8新功能保持異步

Java 8于2014年3月發(fā)布,并附帶了許多新功能。 鮮為人知的,極為有用卻被人誤解的功能之一是對(duì)Future接口的全新改進(jìn),即擴(kuò)展:CompletableFuture <T>。

在下面的文章中,我們將提供CompletableFuture的整體視圖,以及它與簡(jiǎn)單的Future有何不同以及何時(shí)有用。

異步Java代碼

Java 7向我們介紹了Future,它表示異步計(jì)算的結(jié)果。 使用Future對(duì)象的主要優(yōu)點(diǎn)是,您可以在等待外部資源的同時(shí)做其他事情。 一種等待資源的非阻塞方式。

使用Future意味著您可以編寫(xiě)一個(gè)方法,而不是立即返回結(jié)果,而是將返回Future對(duì)象。 當(dāng)您需要實(shí)際結(jié)果時(shí),只需使用Future.get()即可在計(jì)算完成后返回該值。

您還可以得到方法檢查計(jì)算是否是做的,一個(gè)辦法取消/檢查它是否被取消。

例如,假設(shè)您要調(diào)用某個(gè)外部資源,例如…… Marvel的開(kāi)發(fā)人員API ,拔出所有名稱中帶有字母“ C”的超級(jí)英雄:

Future < String > marvel = executor.submit(new Callable < String > () {public String call() {return getMarvelHeroWithCharacter(“C”); // totally not making this up} });// other very important stuff of course, non-blocking ftwSystem.out.println(marvel.get()); // this bit is blocking if the result isn’t ready yet

是的,如果我們確實(shí)想使用完全異步的非阻塞選項(xiàng),那我們就不走運(yùn)了。 我們無(wú)法保證未來(lái)確實(shí)存在,我們可能必須等待。 這是CompletableFuture出現(xiàn)的地方,它有助于解決棘手的問(wèn)題。

那么,CompletableFuture有什么新功能?

CompletableFuture <T>擴(kuò)展了Future <T>并使之……可完成。 考慮到Future對(duì)象在Java 8之前是受限制的,只有5種可用方法,所以這很重要。

此新的和改進(jìn)的CompletableFuture具有2個(gè)主要優(yōu)點(diǎn):

  • 可以通過(guò)調(diào)用complete()方法顯式完成此操作,而無(wú)需任何同步等待。 它允許將來(lái)使用默認(rèn)/中間結(jié)果,使用默認(rèn)返回值提供任何類(lèi)型的值,即使計(jì)算未完成。
  • 使用數(shù)十種新方法,它還允許您通過(guò)一系列操作來(lái)構(gòu)建管道數(shù)據(jù)流程。 您可以找到許多CompletableFuture模式,例如從任務(wù)創(chuàng)建CompletableFuture或構(gòu)建CompletableFuture鏈。 可通過(guò)Oracle的CompletableFuture文檔獲得完整列表。
  • 回到我們的簡(jiǎn)單示例,假設(shè)Marvel的API沒(méi)有返回及時(shí)的結(jié)果,并且getMarvelHeroWithCharacter()仍在處理中,這是很耗時(shí)的,而與此同時(shí)我們已經(jīng)完成了其他所有想做的事情。 假設(shè)我們不想等待( 我們的生命結(jié)束了 ),CompletableFuture可以幫助我們返回中間結(jié)果。 像……神秘,因?yàn)樵谧顗牡那闆r下,她可以變身為其他超級(jí)英雄。

    CompletableFuture < String > marvel = executor.submit(new Callable < String > () {public String call() {return getMarvelHeroWithCharacter(“C”);} });// other stuff goes heremarvel.complete(“Mystique”); // sets a “default” value if not yet completedSystem.out.println(marvel.get()); // non-blocking

    您也可以預(yù)先創(chuàng)建一個(gè)完整的CompletableFuture,該函數(shù)將返回一個(gè)已知值。 如果您想將已知值與需要計(jì)算的值結(jié)合起來(lái),這在測(cè)試環(huán)境中可能會(huì)派上用場(chǎng):

    CompletableFuture < String > cf =CompletableFuture.completedFuture("I'm done!"); cf.isDone(); // return true cf.join(); // return "I'm done"

    還有數(shù)十種其他更有用的方法,它們包括轉(zhuǎn)換并作用于一個(gè)CompletableFuture(thenApply),在完成時(shí)運(yùn)行代碼(thenAccept / thenRun),將兩個(gè)CompletableFuture組合在一起等等。 要獲得完整的指南,我們建議您閱讀Java 8:CompletableFuture的權(quán)威指南 。

    滿足選擇

    如果您使用的是Guava或Scala(及其Futures ),則此新功能可能聽(tīng)起來(lái)很熟悉。 它與Guava的ListenableFuture相似,后者為Future對(duì)象定義了一個(gè)一致的API,用于注冊(cè)完成回調(diào)。

    與新的CompletableFuture相似,添加回調(diào)的功能允許以異步有效的方式響應(yīng)傳入的事件。 您可以注冊(cè)要在計(jì)算完成后執(zhí)行的回調(diào),并支持基本Future接口不支持的許多操作。

    當(dāng)艱難的時(shí)刻

    使用CompletableFuture使我們能夠與我們的代碼一起運(yùn)行,而不必等待結(jié)果,但是它仍然不能保證您的代碼在生產(chǎn)中運(yùn)行時(shí)不會(huì)中斷。 發(fā)生錯(cuò)誤時(shí),您將需要盡快識(shí)別和分析它們,以部署修補(bǔ)程序。

    對(duì)于此類(lèi)情況, Takipi將使您能夠在問(wèn)題出現(xiàn)時(shí)有效地解決代碼中的問(wèn)題,而不必“等”到其他人遇到它們。

    最后的想法

    CompletableFuture恰好適合作為異步編程趨勢(shì)的一部分,該趨勢(shì)在過(guò)去幾年中變得很流行。 難怪每個(gè)人都在談?wù)撍?#xff0c;因?yàn)槲覀兛梢允褂盟瑫r(shí)運(yùn)行許多任務(wù),從而實(shí)現(xiàn)最佳工作流程。

    如果您已經(jīng)是異步編程的狂熱愛(ài)好者,則可能需要查看我們有關(guān)7種您必須知道的反應(yīng)性編程工具的文章 。

    翻譯自: https://www.javacodegeeks.com/2016/06/back-completablefuture-java-8-feature-highlight.html

    總結(jié)

    以上是生活随笔為你收集整理的返回CompletableFuture:Java 8功能亮点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。