The trick is to first make sure that none of the futures has failed. .recover
is your friend here, you can combine it with map
to convert all the Future[T]
results to Future[Try[T]]]
instances, all of which are certain to be successful futures.
note: You can use Option
or Either
as well here, but Try
is the cleanest way if you specifically want to trap exceptions
def futureToFutureTry[T](f: Future[T]): Future[Try[T]] =
f.map(Success(_)).recover { case x => Failure(x)}
val listOfFutures = ...
val listOfFutureTrys = listOfFutures.map(futureToFutureTry(_))
Then use Future.sequence
as before, to give you a Future[List[Try[T]]]
val futureListOfTrys = Future.sequence(listOfFutureTrys)
Then filter:
val futureListOfSuccesses = futureListOfTrys.map(_.filter(_.isSuccess))
You can even pull out the specific failures, if you need them:
val futureListOfFailures = futureListOfTrys.map(_.filter(_.isFailure))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…