Async Http Client library(Nettyを使用)を使用して、RESTful APIに非同期Http Getリクエストを送信しています。ノンブロッキングの動作を保持したいので、Http Getリクエストの結果としてCompletableFuture<T>
のインスタンスを返します。したがって、RESTfulなAPIエンドポイントがJson配列を返すところでは、私はCompletableFuture<T[]>
を返しています。CompletableFuture <Stream<T>>をブロックすることなく<T>に変換するにはどうすればいいですか
まだ、The Four Essential Effects In ProgrammingについてのErik Meijerの分類によると、私はStream<T>
が非同期Http Get要求を行い、Json配列を返すJavaメソッドの結果に、より適していると考えます。この場合、Stream<T>
はObservable<T>
と等価で、多くの値を返す非同期計算の結果はとなります。
ので、resp
が応答を保持していることを考えると、私は、次のようCompletableFuture<Stream<T>>
を取得することができます:
CompletableFuture<T[]> resp = …
return resp.thenApply(Arrays::stream);
をしかし、私はに計算を待たずに、私はCompletableFuture<Stream<T>> resp
Stream<T>
に変換することができますどのように思っていました完了しました(つまり、私はget()
呼び出しをブロックしたくありません)?
私は、次の式と同じ結果を持って好きですが、get()
にブロックすることなくなります
return resp.thenApply(Arrays::stream).get();
それはストリーム操作が 'CompletableFuture'の完了までブロックされるという事実は変わりません。それはちょうどそれを少し高い価格で遅らせます。 – Holger
オフコース。しかし、たびに横断されます。 OPでは、著者は '[] T'eitherをトラバースしていません。 –
確かに。私は制限を強調したかっただけです(私はOPがそれらを認識しているかどうか分かりません)。私はそれらについてより詳細に解答を加えました。 – Holger