'.map or match returning Future[List] when expected to return List

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)
        }
        
       
    }
}


Solution 1:[1]

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 having the map and match together 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)

Solution 2:[2]

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 gsoto