如何用Java返回自己的未来?

时间:2015-11-02 22:11:38

标签: java concurrency future

在Java 8中,我正在编写一个DAO方法,该方法调用一个返回ListenableFuture的方法(在这种情况下,它是一个返回ResultSetFuture的Cassandra异步查询)。

但是,我坚持认为我应该如何将Future返回给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?
}

1 个答案:

答案 0 :(得分:4)

由于您似乎正在使用Guava的ListenableFuture,因此最简单的解决方案是来自Futures的{​​{3}}方法:

  

返回一个新的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);
}