問題是假設有xyz()一個回傳型別為的函式現在我想要的是每當這個布林值為真時Future[Some[Boolean]]我想觸發一個函式我不知道如何在 scala 中解構它。abc()我試過的是
val ans = xyz()
ans.map((itr)=>{
itr match{
Some(true)=> abc()
}
})
我也可能完全錯了,我對期貨不太了解,請推薦任何易于理解的期貨檔案,還請解釋什么是解構未來值map或函式的技術,或者flatmap因為我看到它們經常使用
uj5u.com熱心網友回復:
我建議熟悉匹配語法,或者使用一些 IDE。有幾種方法可以實作這一點,例如
ans.map {
// case is necessary when you ar matching
case Some(true) => abc()
// handle all the cases, even if you need a wildcard
case _ => // otherwise
}
如果您完成了 Coursera 或其他免費教程之類的內容,它們是顯而易見的。
uj5u.com熱心網友回復:
AFuture表示可能尚未計算的值。在存在價值之前,沒有什么可以解構的。
檢查 a 值的最簡單但不確定的方法Future是通過該value方法,該方法(在您的情況下)會將其投影到 a Option[Try[Option[Boolean]]],值解釋為:
None表示未來尚未完成,因此沒有價值Some(Failure(exception))意味著未來以失敗告終,失敗被闡述為exceptionSome(Success(None))意味著未來完成NoneSome(Success(Some(true)))意味著未來完成Some(true)Some(Success(Some(false)))意味著未來完成Some(false)
如前所述,這是不確定的,盡管一旦從value轉換None到Some,它將保持這種狀態,因此您可以使用 while 回圈來檢查value。
也就是說,通過阻塞使用Await.result(future, someDurationToWait). 如果未來失敗,這將拋出例外,否則你會得到一個Option[Boolean]結果。
這種方法的缺點是阻塞執行緒,這是一種有限的資源,而且經常這樣做會導致死鎖。所以你真的應該只Await.result在程式的最外層做,或者在你絕對必須提供阻塞 API 的地方做。
Scala 中最慣用的事情是安排回呼執行以回應未來的值完成。安排回呼有四種主要方法,每種方法都要求您指定將ExecutionContext在其中執行回呼的方法(選擇正確ExecutionContext的方法超出了此答案的范圍):
filter:通過未更改的方式傳遞失敗的未來并將成功的未來轉變為失敗的未來,除非滿足某些謂詞。
val fut: Future[Option[Boolean]] = ???
// assuming that fut completes, transformed will only be failed or succeed with `Some(true)`
val transformed: Future[Option[Boolean]] =
fut.filter(_.contains(true))
foreach:如果未來成功,會將結果傳遞給呼叫副作用的函式:
val fut: Future[Option[Boolean]] = ???
// will print Some(false) or Some(true) or None if the future completes, otherwise nothing will ever print
fut.foreach(println _)
map: 穿越失敗的未來,轉化成功未來的價值
val fut: Future[Option[Boolean]] = ???
def f(x: Option[Boolean]): Int =
x match {
case None => 0
case Some(false) => 1
case Some(true) => 2
}
val transformed: Future[Int] = fut.map(f)
flatMap: 讓您通過轉變來轉變未來,從而帶來另一個未來
val fut: Future[Option[Boolean]] = ???
def callAnotherApi(): Future[Int] = ???
def f(x: Option[Boolean]): Future[Int] =
x match {
case None => Future.failed(new IllegalArgumentException("don't know"))
case Some(false) => Future.successful(1)
case Some(true) => callAnotherApi()
}
fut.flatMap(f)
uj5u.com熱心網友回復:
在這種情況下可能有點矯枉過正,但我??建議使用貓來處理Future[Option[T]]:
val ans = OptionT(xyz())
ans.collect {
case true => abc()
}
斯卡斯蒂:https ://scastie.scala-lang.org/5tnWZ4MnQQ2MKMZPVLheAg
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/415006.html
標籤:
上一篇:資料接收后如何移動到下一個視圖?
