在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?
}
答案 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);
}