如何在Java中返回自己的Future?

5
在Java 8中,我正在编写一个DAO方法,该方法调用返回ListenableFuture的方法(在这种情况下,它是返回ResultSetFuture的Cassandra异步查询)。
然而,我不知道如何将Future返回给DAO方法的调用者。我不能只返回ResultSetFuture,因为该future返回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?
}

你正在使用Java 8并发类型还是Guava?Guava有一个ListenableFuture类型,而JDK没有。 - Thorn G
Cassandra API 返回一个 ListenableFuture,但我很乐意使用 Java 8 的并发类型。我实际上没有注意到 ListenableFuture 是来自 guava 的。现在我意识到 CompletableFuture 可能是适当的类来使用。即便如此,我仍然不确定该怎么做。 - HappyEngineer
好的 - 我会更新我的答案,同时使用CompletableFuture提供另一种解决方案。 - Thorn G
1个回答

4

看起来您正在使用Guava的ListenableFuture,最简单的解决方案是使用Futures中的transform方法:

返回一个新的ListenableFuture,其结果是将给定函数应用于给定Future的结果的乘积。

有几种使用方法,但由于您使用的是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上调用thenApply方法。这似乎与Futures.transform做的事情相同。谢谢! - HappyEngineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接