在Futures.transform中,使用Function和AsyncFunction有什么区别

STh*_*mas 7 java future guava concurrent.futures

我知道Function的apply方法同步返回一个对象,AsyncFunction的应用程序异步运行并返回一个Future.

你能举个例子说明何时选择什么.

我看到的一个代码片段看起来像这样:

Futures.transform(someFuture, new AsyncFunction<A, B>() {
  public B apply(A a) {
    if (a != null) {
      return Futures.immediateFuture(a.getData())
    } else {
      return Futures.immediateFailedFuture(checkException(());
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

由于AsyncFunction内的值是立即返回的,为什么需要AsyncFunction呢?或者这只是我遇到的一个不好的例子?

Eti*_*veu 10

您找到的代码片段是一个错误的示例,因为它使用AsyncFunction来同步计算某些内容.这是不必要的冗长.

使用标准代码更清晰Function:

Futures.transform(someFuture, new Function<A, B>() {
  public B apply(A a) {
    if (a != null) {
      return a.getData();
    } else {
      throw checkException();
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

AsyncFunction当转换A到B的代码是异步时,您应该使用.在您的示例中,代码可能最初是异步的,后来更改为使用Futures.immediateFuture()/ Futures.immediateFailedFuture()由没有AsyncFunction用a 替换的程序员Function.或许他只是错过了重载方法.

  • Futures.immediateFuture() 是一个阻塞调用。它创建了一个 Future,但在调用它的同一线程中,这就是我们知道示例是同步的。 (2认同)

Sot*_*lis 3

既然AsyncFunction中的值作为立即结果返回,为什么这里需要AsyncFunction呢?或者这只是我遇到的一个坏例子?

小心。该代码段生成匿名类的实例并将该实例传递给该transform方法。该transform方法将使用AsyncFunction一个单独的线程。返回Future的链用于检索 的结果AsyncFunction并返回 的结果Future。这段代码仍然涉及到异步处理。

当您想要并且可以在执行其他任务时继续工作时,请使用异步处理。