2017-05-17 77 views
1

我正在使用Guava Futures將未來的調用鏈接在一起。特別是我使用的組合爲Futures.transform(...)Futures.transformAsync(...),但生成的代碼不是非常可讀。有沒有辦法以更「流利」的方式表達同樣的東西?轉換期貨的流利語法

+2

你可以顯示你的例子意思是*不太可讀*? – Eugene

回答

1

如果您正在尋找流利方法鏈接就像JDK的CompletableFuture

completableFuture 
    .thenApply(f1) 
    .thenApplyAsync(f2, executor) 

則沒有,用番石榴的ListenableFuture和包裝transform s是要走的路是不可能的。 (也許谷歌內部他們有一些精通包裝編輯 - 您對谷歌工作,所以你會知道;))

說了這麼多,你可以:

  • 使用一些現有的代碼來擴展ListenableFuture用流利的方法(如在this - rather niche - Github project called fluent-futures,但它使用舊番石榴< 20 API),
  • 寫自己的包裝用這樣的方法(例如,基於CompletableFuturefluent-futures API),
  • 堅持番石榴API(至少是什麼我們在處理ListenableFuture API時)
  • 使用一些適配器並將ListenableFuture轉換爲CompletableFuture並使用其流暢的API - 例如, future-converter

    import static net.javacrumbs.futureconverter.java8guava.FutureConverter.*; 
    
    //... 
    ListenableFuture<String> guavaListenableFuture = toListenableFuture(completable); 
    //... 
    CompletableFuture<String> completable = toCompletableFuture(listenable); 
    
+2

(我們確實有一個流利的包裝,現在審查,希望在未來幾周內提交,它也會出現在公共Guava。) –

+0

這很棒,不能等待! – Xaerxess

2

@ChrisPovirk mentioned in a comment上個月一口流利的包裝很快就出現在公衆番石榴,以及它現在有23.0快照。

新的FluentFuture類註釋爲@Beta因此,甚至當番石榴23.0發佈時,它可能仍然會有變化。

無論如何,如果你git clone番石榴,現在,你可以這樣做:

ExecutorService executor = Executors.newFixedThreadPool(1); 
// WARNING: based on UNRELEASED version, this is just to get a glimpse of the future... (Future... get it?) :o) 
FluentFuture<String> f = 
     FluentFuture.from(immediateFuture("world")) 
       .transform(name -> "Hello " + name, directExecutor()) 
       .transformAsync(input -> immediateFuture(input + "!"), executor); 
System.out.println(f.get()); 

(其中,令人驚訝的是輸出 「Hello World!」)

+0

番石榴23 rc1現已發佈! –