2015-11-02 30 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