9

Function の apply メソッドはオブジェクトを同期的に返し、AsyncFunction の apply メソッドは非同期的に実行されて Future を返すことを知っています。

いつ何を好むかの例を教えてください。

私が見た 1 つのコード スニペットは、次のようなものでした。

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(());
    }
  });
});

AsyncFunction 内の値はすぐに結果として返されるのに、なぜここで AsyncFunction が必要なのですか? それとも、これは私が遭遇した単なる悪い例ですか?

4

4 に答える 4

10

あなたが見つけたコードスニペットは、同期的に計算されるものに AsyncFunction を使用するため、悪い例です。不必要に冗長です。

標準を使用すると、コードはよりクリーンになりますFunction

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

AsyncFunctionA を B に変換するコードが非同期の場合は、を使用する必要があります。あなたの例では、コードが最初は非同期で、後で/ を .に置き換えなかったプログラマーによってFutures.immediateFuture()/を使用するように変更された可能性があります。または、オーバーロードされたメソッドを見逃しただけかもしれません。Futures.immediateFailedFuture()AsyncFunctionFunction

于 2014-06-05T15:45:09.777 に答える
3

AsyncFunction 内の値は即時の結果として返されるので、なぜここで AsyncFunction が必要なのですか? それとも、これは私が遭遇した単なる悪い例ですか?

気をつけろ。そのコードは、匿名クラスのインスタンスを生成し、そのインスタンスをtransformメソッドに渡しています。このtransformメソッドはAsyncFunction別のスレッドを使用します。返されたFutureチェーンは、 から結果を取得し、そのAsyncFunction結果を返しFutureます。このコードにはまだ非同期処理が含まれています。

必要に応じて非同期処理を使用し、他の何かが実行されている間も作業を続行できます。

于 2014-06-05T00:27:14.080 に答える