前回の記事では、ListenableFuture の世界について説明しました。ここで、特に変換とチェーンに焦点を当てて、より高度なテクニックを詳しく見てみましょう。非同期サービスから取得した ListenableFuture があると想像してください。さらに、次のような簡単な方法もあります。
Document parse(String xml) {//...
文字列自体を操作する代わりに、ドキュメントが必要です。 1 つのアプローチは、Future を解決して String を処理することです。ただし、より洗練された解決策は、結果が利用可能になったら変換を適用し、メソッドが常に ListenableFuture を返したかのように動作するようにすることです。これは非常に簡単です:
final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, new Function() { @override public Document apply(String contents) { return parse(contents); } });
または、読みやすくするために次のようにします:
final Function parseFun = new Function() { @override public Document apply(String contents) { return parse(contents); } }; final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, parseFun);
Java 構文には制限があるかもしれませんが、これまでに達成したことに焦点を当ててみましょう。 Futures.transform() は、基礎となる ListenableFuture が parse() 変換を適用するのを待ちません。代わりに、コールバックを登録し、指定されたフューチャーが完了するたびに通知を受け取ることができるようにします。この変換は、適切なタイミングで動的かつ透過的に適用されます。まだFutureがありますが、今回はDocumentをラップしています。
さて、さらに一歩進めてみましょう。また、特定のドキュメントの関連性 (このコンテキストでの意味が何であれ) を計算する、非同期でおそらく長時間実行されるメソッドもあります。
ListenableFuture calculateRelevance(Document pageContents) {//...
すでに所有している ListenableFuture と何らかの方法で連鎖させることはできますか?最初の試み:
final Function> relevanceFun = new Function>() { @override public ListenableFuture apply(Document input) { return calculateRelevance(input); } }; final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, parseFun); final ListenableFuture> relevanceFuture = Futures.transform(documentFuture, relevanceFun);
強化された非同期プログラミングの可能性の詳細については、このリンクを参照してください。
以上がJava Futures でより高速な非同期プログラミングを実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。