Home > Net >  .map or match returning Future[List] when expected to return List
.map or match returning Future[List] when expected to return List

Time:02-01

I am kind of failing this weird behaviour not sure where i am wrong exactly. So the situation is that tester2 function is returning a Future[Boolean]] now I want to wait for this to complete and when it gets completed I want it to return a List[String] based on different cases inside reset function, now the problem is instead of returning up a List[String] it is returning Future[List[String]] , not able to understand why match function behaving like this

I am getting this error to be exact

    val les = Await.ready(tester2(5),Duration.Inf).map(reset).forEach(println)

object HelloWorld {

def main(args: Array[String]) {


    val exp = tester2(5).map(reset)

    val les = Await.ready(tester2(5),Duration.Inf).map(reset).forEach(println)
    println(s"what do you say ${les}")


}
def reset (x: Option[Boolean]): List[String] =
  x match {
    case None =>  List("abc","def")
    case Some(false) =>  List("abc","def")
    case Some(true) =>  List("def","abc")
  }

def tester():Future[Option[Message]]={
    Future{
        Thread.sleep(5000)
        Option(Message("abc","def","ghi"))
    }
}
def tester2(param:Int):Future[Option[Boolean]]={
    Future{
        Thread.sleep(5000)
        if(param>10){
            Some(true)
        }else{
            Some(false)
        }
        
       
    }
}

CodePudding user response:

If tester2 returns a Future of an Option of a Boolean

def tester2(param:Int):Future[Option[Boolean] = ???

and you want to change the value to a string you need to say "when this future completes and there is a real Option[Boolean].. then do this thing. This is what "map" does on a future. It says "once the future completes, run this code". So you can do this:

def reset (in :Future[Option[Boolean]]) = in.map { optionOfBoolean :Option[Boolean] =>

optionOfBoolean match {
    case None => ...
    case Some(true) ...
}

}

Scala also allows you to short cut this and just write:

def reset (in :Future[Option[Boolean]]) = in map { case None => List("abc", "bcd") case Some(true) => List("d3", "d4") case Some(false) => List("sds", "dssds") }

Since I can't see your error I can't help you further but something like this should work.

val booleanResult :Future[Option[Boolean]] = tester2(...)
val futureListStr :Future[List[String]] = reset(booleanResult)
val answer :List[String] = Await.result(futureListStr, scala.concurrent.duration.Duration.Inf)

CodePudding user response:

Use Await.result to extract the result value.

final def result[T](awaitable: Awaitable[T], atMost: Duration): T

Await and return the result (of type T) of an Awaitable.

awaitable the Awaitable to be awaited

atMost maximum wait time, which may be negative (no waiting is done), >Duration.Inf for unbounded waiting, or a finite positive duration

returns the result value if awaitable is completed within the specific maximum wait time

  •  Tags:  
  • Related