簡體   English   中英

Scala - 與自己的類型(字符串)和未來的類型不匹配問題

[英]Scala - type mismatch problem with own type (String) and Future

我有一個方法,它需要String類型作為參數:

type Identity = String
case class RequireSmth(param: Identity) extends Something

現在我以更復雜的順序調用這個方法:

createMe(as[List])(arg =>{ parse(RequireSmth(getAction(name, surname).map(bool => getData(surname, bool).id))) })

Parse看起來像:

def parse(ob: Something)

在哪里:

def getAction(name: String, surname: String): Future[Boolean] = {
    someObject.get(name).map(_.getSomething(surname).isPossibleToTake.getOrElse(false)) //someObject is defined in constructor and does not matter here
}

def getData: (String, Boolean) => MyObject = {
    case ("Doe", true) => possible
    case _ => notPossible
}

MyObjectpossiblenotPossible定義:

case class MyObject(id : String, name: String, surname: String)

val possible = MyObject( id = "ok", name ="John", surname = "Doe")
val notPossible = MyObject( id = "not ok", name ="John", surname = "Doe")

問題是,當我調用RequireSmth方法時出現錯誤:

type mismatch;
found: scala.concurrent.Future[String]
required: com.my.smth.Identity (which expands to) String

如何解決此問題以返回Identity (或String )而不是Future[String]

您需要翻轉方法調用:

val res: Future[???] = 
   getAction(name, surname)
     .map(bool => getData(surname, bool).id)
     .map(RequireSmth)
     .map(parse)

請注意Future[String]不是一個String ,它是一個將在未來產生一個值的計算,這意味着整個計算堆棧也需要返回一個Future[T] (除非你明確地等待,它會阻塞和不推薦)。

將信息保存在Future如下所示:

getAction(name, surname).map(bool => getData(surname, bool).id).map(RequireSmth)

只需將操作鏈接在一起,將所有內容保存在Future

getAction(name, surname)
  .map(bool => getData(surname, bool).id)
  .map(RequireSmth) // Or x => RequireSmth(x) if necessary
  .map(parse)

在某個時候,您將獲得一個具有副作用並返回Unit的方法,該方法將在Future中的所有操作完成時執行。

萬一您確實需要從Future獲取值,請使用Await.result 但在大多數情況下,這不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM