我如何 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);
}
在 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);
}