2017-12-12 9 views
0

私は、Javaで@AsyncアノテーションとCompletableFuturesを使用していくつかの呼び出しを非同期にしています。非同期呼び出しでオブジェクトを作成するPojoがいくつかありますが、リストに結果を収集しようとすると、EclipseはPojoのリストをObjectのリストに変更したいと思っています。ストリームからの応答をデフォルトにしているCompletableFutureであるかどうかを理解する。このCollectors.toListにオブジェクトのリストを期待するデフォルト設定は何ですか?

List<Pojo1> crudResponse = null; 
List<Pojo1> listOfIterations = new ArrayList<>(); 

//populates object with multiple entries in list 
listOfIteration = populateIterationObject(param); 

crudResponse = listOfIterations.stream() 
    .map(str -> CompletableFuture.supplyAsync(() -> { 
     try { 
      return async.hitCrud(str); 
      }catch(RequestProcessingException e){ 
       log.error(e); 
      } 
      return function; 
     })) 
     .map(CompletableFuture::join) 
     .collect(Collectors.toList()); 
     } 

//async class 
    public CompletableFuture<Pojo1> hitCrud(Pojo1 iteration) throws RequestProcessingException { 

     try { 
      String response; 
      Pojo1 pojoResponse; 
      response = connectToCrud(iteration); 

      if(response != null) { 
       pojoResponse.add(response); 
      }      
     }catch(Exception ex){ 
      log.error(ex); 
     } 
     return CompletableFuture.completedFuture(pojoResponse); 
    } 

私はPojo1のオブジェクトを返すようにする方法を打つ、まだ私はCollectors.toListを(使用してリストを作成しようとすると)私が働くことができる<Object>のリストを持っているように私に期待していますが、より多くかかります私が非同期呼び出しから返す各応答を引き出してキャストするコード。

これはデフォルトのObjectであるCompletableFutureですか?もしそうなら、それをPojo1のタイプにデフォルト設定することは可能ですか?

編集:私はIDEで見てい エラー:

Type mismatch: cannot convert from List<Object> to List<Pojo1> 
+0

いいえ、それは混乱のエディタだと型を推論することができません。彼らは時々それをする。 – Kayaman

+1

実際、あなたには型安全性の問題があるようですが、例の不完全さのために確信が持てません。私は欠けているビットのほとんどをダミーにすることができましたが、 'function'のタイプは何ですか? –

答えて

1

Javaはあなたのコードが間違っているので、あなたが望むよりも拘束異なるタイプを推測されます。

crudResponse = listOfIterations.stream() 
    .map(str -> CompletableFuture.supplyAsync(() -> { 
     try { 
      return async.hitCrud(str); 
      }catch(RequestProcessingException e){ 
       log.error(e); 
      } 
      return function; 
     })) 
     .map(CompletableFuture::join) 
     .collect(Collectors.toList()); 
:...

//async class 
public CompletableFuture<Pojo1> hitCrud(Pojo1 iteration) // ... 

List<Pojo1> crudResponse = null; 
List<Pojo1> listOfIterations = new ArrayList<>(); 

与えられた、のは、このストリームの表現を分析してみましょう

  • listOfIterations.stream()外側ラムダの戻り型として、引き数から推測しなければならない最初のmap()メソッド呼び出しのStream<Pojo1>
  • 型パラメータを生成します。
  • 外ラムダの戻り型は、それ自体は、内側ラムダの戻り型自体でCompletableFuture.supplyAsync()呼び出し、...
  • のことから推測しなければなりません。では、その戻り値の型は何ですか?
    • よく、内側ラムダは、async.hitCrud(str)を呼び出すCompletableFuture<Pojo1>
    • の結果を返すことができ、またはそれはそのタイプが何であれ、functionを返すことができます。
    • これらの2つのタイプのうち最も近い共通の祖先は、おそらくCompletableFuture<Pojo1>またはObjectのいずれかになります。エラーメッセージが与えられた場合、恐らくObjectとなります。
  • ですから、Stream<CompletableFuture<Object>>にマッピングされている、ように次のマッピングがリストにあなたList<Object>、ないList<Pojo1>を与えることを収集Stream<Object>
  • が得られます。リストは本当にPojo1のないオブジェクトが含まれる場合があります。化粧品問題は単にではありません

functionのタイプがCompletableFuture<Pojo1>の場合、解析がどのように変化するかを検討してください。hitCrud()の戻り値も同様です。次に、内側ラムダの戻り値の型はCompletableFuture<Pojo1>となりますが、戻り値の型は外側ラムダCompletableFuture<CompletableFuture<Pojo1>>になります。最終的には、List<CompletableFuture<Pojo1>>が得られます。それが実際にある場合にのみ、内一つを使用してstrをマップするように、あなたのケースは、あなたが外側のラムダを排除することによって、問題を解決することができます

crudResponse = listOfIterations.stream() 
    .map(str -> { 
      try { 
       return async.hitCrud(str); 
      } catch(RequestProcessingException e) { 
       log.error(e); 
      } 
      return function; 
     }) 
     .map(CompletableFuture::join) 
     .collect(Collectors.toList()); 
関連する問題