[英]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
}
MyObject
, possible
和notPossible
定義:
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.