2015-11-02 32 views
4

在Java 8中,我正在編寫一個DAO方法,它調用一個返回ListenableFuture的方法(在這種情況下,它是一個返回ResultSetFuture的Cassandra異步查詢)。如何在Java中返回自己的期貨?

但是,我被困在我應該如何返回到DAO方法的調用者的未來。我不能只返回ResultSetFuture,因爲這將來會返回一個ResultSet。我想處理ResultSet並返回一個不同的對象。例如:

public ListenableFuture<ThingObj> queryForThingAsync(String thingId) { 
    ListenableFuture<ResultSet> rsFuture = db.getSession().executeAsync(QueryBuilder.select().all().from("thingSchema","Thing").where(eq("thingId",thingId))); 
    // Now what? How do I create a ListenableFuture<ThingObj> given a ListenableFuture<ResultSet> and a method that can convert a ResultSet into a ThingObj? 
} 
+0

你使用的是Java併發8種,或番石榴?番石榴有一個'ListenableFuture'類型,JDK沒有。 –

+0

Cassandra api返回一個ListenableFuture,但我很樂意使用Java 8併發類型。我沒有注意到ListenableFuture來自番石榴。我現在意識到CompletableFuture可能是適合使用的類。即便如此,我仍然不確定如何去做。 – HappyEngineer

+0

好的 - 我會更新我的答案,以包含使用'CompletableFuture'的備用解決方案。 –

回答

4

由於看來你使用番石榴的ListenableFuture,最簡單的解決方法是從Futurestransform方法:

返回一個新ListenableFuture,其結果是應用給定功能的產品到給定的未來的結果。

有使用它的一些方法,但由於你Java的8,最簡單的是有可能與方法參考:

public ListenableFuture<ThingObj> queryForThingAsync(String thingId) { 
    ListenableFuture<ResultSet> rsFuture = db.getSession().executeAsync(QueryBuilder.select().all().from("thingSchema","Thing").where(eq("thingId",thingId))); 
    return Futures.transform(rsFuture, Utils::convertToThingObj); 
} 
+1

我找到了一個轉換器java8-guava(https://github.com/lukas-krecan/future-converter/blob/master/README.md),它在兩種類型之間進行轉換。我只是使用FutureConverter.toCompletableFuture從ListenableFuture轉換爲CompletableFuture。然後我打電話在CompletableFuture上申請。這似乎與Futures.transform一樣。謝謝! – HappyEngineer