【问题标题】:How do I return my own futures in Java?如何在 Java 中返回我自己的期货?
【发布时间】:2015-11-02 22:11:37
【问题描述】:

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

【问题讨论】:

  • 您使用的是 Java 8 并发类型还是 Guava? Guava 有一个ListenableFuture 类型,JDK 没有。
  • Cassandra api 返回一个 ListenableFuture,但是我很乐意使用 Java 8 并发类型。我实际上并没有注意到 ListenableFuture 来自番石榴。我现在意识到 CompletableFuture 可能是适合使用的类。即便如此,我仍然不知道该怎么做。
  • 好的 - 我将更新我的答案以包括使用 CompletableFuture 的替代解决方案。

标签: java concurrency future


【解决方案1】:

由于您使用的是 Guava 的 ListenableFuture,因此最简单的解决方案是来自 Futurestransform 方法:

返回一个新的 ListenableFuture,其结果是将给定 Function 应用于给定 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);
}

【讨论】:

  • 我找到了一个转换器 java8-guava (github.com/lukas-krecan/future-converter/blob/master/README.md),它可以在两种类型之间进行转换。我只是使用 FutureConverter.toCompletableFuture 从 ListenableFuture 转换为 CompletableFuture。然后我在 CompletableFuture 上调用 thenApply。这似乎与 Futures.transform 做同样的事情。谢谢!
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多