我如何 return 我自己的 Java 期货?

How do I return my own futures in Java?

在 Java 8 中,我正在编写一个 DAO 方法,该方法调用 return 一个 ListenableFuture 的方法(在本例中,它是一个 return 一个 ResultSetFuture 的 Cassandra 异步查询) .

但是,我仍然坚持我应该如何 return DAO 方法的调用者的 Future。我不能只 return ResultSetFuture 因为那个未来 return 是一个 ResultSet。我想处理 ResultSet 和 return 一个不同的对象。例如:

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?
}

既然您使用的是 Guava 的 ListenableFuture,最简单的解决方案是 Futures 中的 transform 方法:

Returns a new ListenableFuture whose result is the product of applying the given Function to the result of the given 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);
}