Map a Future for both Success and Failure

后端 未结 4 2081
闹比i
闹比i 2021-01-30 22:38

I have a Future[T] and I want to map the result, on both success and failure.

Eg, something like

val future = ... // Future[T]
val mapped = future.mapAll         


        
4条回答
  •  半阙折子戏
    2021-01-30 22:50

    Edit 2017-09-18: As of Scala 2.12, there is a transform method that takes a Try[T] => Try[S]. So you can write

    val future = ... // Future[T]
    val mapped = future.transform {
      case Success(_) => Success("OK")
      case Failure(_) => Success("KO")
    }
    

    For 2.11.x, the below still applies:

    AFAIK, you can't do this directly with a single PF. And transform transforms Throwable => Throwable, so that won't help you either. The closest you can get out of the box:

    val mapped: Future[String] = future.map(_ => "OK").recover{case _ => "KO"}
    

    That said, implementing your mapAll is trivial:

    implicit class RichFuture[T](f: Future[T]) {
      def mapAll[U](pf: PartialFunction[Try[T], U]): Future[U] = {
        val p = Promise[U]()
        f.onComplete(r => p.complete(Try(pf(r))))
        p.future
      }
    }
    

提交回复
热议问题