2017-12-31 228 views
0

내가 가지고있는 서로 다른 유형의 3 scala.concurrent.Futureakka.dispatch.Futures.sequence 내부 통지를 받았습니다하기 위해 그들을 구성 할 필요가의 미래를 구성 선언 된 Iterable<Future<Object>>Iterable<Future<Object>> futureIterable = new ArrayList<>();는 Akka 다른 유형

은 다음과 같이

Iterable<Future<Object>> futureIterable = new ArrayList<>(); 
    Future<Iterable<Future<Object>>> futureListOfInts=sequence(futureIterable,getContext().dispatcher()); 

나는이 다있어 ompilation 메시지 :

Error:(139, 67) java: incompatible types: inferred type does not conform to equality constraint(s) 
inferred: scala.concurrent.Future<java.lang.Object> 
equality constraints(s): scala.concurrent.Future<java.lang.Object>,java.lang.Object 

답변

0

Futures.sequence이 같은 tipe A의 목적으로 Future[Iterable[A]]Iterable[Future[A]] 변환에서 잘 작동합니다. 다른 Future의의 completition은 "대기"를

, 더 일반적이고 관용적 방법은 다음 코드처럼, 그들 flatMap이다 :

final ExecutionContext ec = getContext().dispatcher(); 

public Future<Result> composeFutures(Future<List<Request>> f1, Future<List<Offer>> f2, Future<Event> f3) { 

    return f1.flatMap(new Mapper<List<Request>, Future<Result>>() { 
     @Override 
     public Future<Result> apply(List<Request> requestList) { 
      return f2.flatMap(new Mapper<List<Offer>, Future<Result>>() { 
       @Override 
       public Future<Result> apply(List<Offer> offers) { 
        return f3.map(new Mapper<Event, Result>() { 
         @Override 
         public Result apply(Event event) { 

          // use requestList, offers, event 
          // to have your result 
          // ... 

          return new Result(); 
         } 
        }, ec); 
       } 
      }, ec); 
     } 
    }, ec); 

} 

당신이 composeFutures 방법은 반환됩니다 볼 수 있듯이 단일 Future이면 f1, f2f3이 성공적으로 완료되면 완료됩니다. 그 중 하나가 실패하면 실패한 미래가 반환됩니다.