2017-04-05 24 views
5

私は、オブジェクトのリストをストリーミングすることによって非同期クライアントメソッドを呼び出しています。このメソッドはFutureを返します。Futuresのリストをストリームする最も効率的な方法

コールの後に返される先物のリストを反復する最良の方法は何ですか(最初に現れるFutureを処理するため)

注:非同期クライアントは、Future not CompletableFutureのみを返します。

以下はコードです:

List<Future<Object>> listOfFuture = objectsToProcess.parallelStream() 
    .map((object) -> { 
     /* calling an async client returning a Future<Object> */ }) 
    .collect(Collectors.toList()); 
+0

を示すよう

forJoinPool.submit(() -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get(); 

私は、カスタムプールに行くと、あなたはCompletionServiceを使用してではなく、配列に結果をマッピングすることを検討しましたか? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

[CompletionService](http://docs.oracle.com/javase/7/docs/)を試してください。 api/java/util/concurrent/CompletionService.html)?ここには[説明](http://stackoverflow.com/a/19348417/6785649)があります。 –

+3

'CompletionService'は、' Future'を生成するコードを制御できない場合、 'Executor'にジョブをサブミットしても意味がありません。 – Holger

答えて

3

List<Future<Object>>のこのリストを持って、私の代わりに、デフォルトのストリームの並列処理を使用しての、カスタムプールにそれを提出します。

これは、ストリームapiが並列処理用の共通プールを使用し、その先物(処理に時間がかかる場合)にgetを呼び出すためです。アプリケーション内で並列操作を使用する他のすべてのストリーム操作をブロックしますこれが行われます。

これは、ビットのようになります:here

関連する問題