溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Future的sequence怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-27 15:51:28 來(lái)源:億速云 閱讀:134 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“Future的sequence怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Future的sequence怎么實(shí)現(xiàn)”吧!

1)關(guān)于Option[T], Either[E, R] 和 Try[T]的使用場(chǎng)景。

這三種type很容易讓人想到處理Exception的場(chǎng)景。這些types如果只是針對(duì)Exception就略顯狹隘了?,F(xiàn)在我的感覺(jué)是:

1)Option適于處理業(yè)務(wù)邏輯上需要空值的地方,這里不一定是因?yàn)镋xception導(dǎo)致。往往是業(yè)務(wù)上需要表達(dá)這種“空”/“沒(méi)值”。

2)Either的左值不一定是Exception,表示一個(gè)計(jì)算可能有兩種結(jié)果比較好,右值按照慣例表示正確/正常路徑下的結(jié)果。左值是另個(gè)分支的結(jié)果。當(dāng)然,也可以放Exception,Error什么的。STTP的Response body部分就是一個(gè)Either[Error, T]。

3)Try,其實(shí)才是最適合表示一個(gè)計(jì)算可能出現(xiàn)Exception的type。Try的apply()接受的就是一個(gè)代碼塊并運(yùn)行,對(duì)異常封裝到子類Failure。

最后的感覺(jué)是Option,Either更像標(biāo)量,是結(jié)果的一個(gè)靜態(tài)表示。而Try是動(dòng)態(tài)的,包含了代碼的執(zhí)行。看Try的定義體會(huì)下:

object Try {  def apply[T](r: => T): Try[T] =    try Success(r) catch {      case NonFatal(e) => Failure(e)    }}

2)Future's sequence()的實(shí)現(xiàn)。

1)這是Erik喜歡的遞歸方式的實(shí)現(xiàn)。

其中兩個(gè)flatMap都是Future上的flatMap。

def sequence[T](fts: List[Future[T]]): Future[List[T]] = {  fts match {    case Nil => Future(Nil)    case ft::fts => ft.flatMap( t => sequence(fts).flatMap(ts => Future(t::ts)))  }}

2)通過(guò)類型推導(dǎo),我發(fā)現(xiàn)把flatMap()換成了map()也符合類型檢查,似乎也也沒(méi)有大的問(wèn)題。但在邏輯上,這個(gè)實(shí)現(xiàn)就是要要等著所有的future依次從尾部開(kāi)始都complete了才能執(zhí)行。而上面的實(shí)現(xiàn)整個(gè)過(guò)程都是異步的,更符合Future的原意。

def sequence[T](fts: List[Future[T]]): Future[List[T]] = {  fts match {    case Nil => Future(Nil)    case ft::fts => ft.flatMap( t => sequence(fts).map(ts => t::ts))  }}

3)Erik通過(guò)async,await實(shí)現(xiàn)的sequence。

這種方式似乎更容易理解,但風(fēng)格太不FP了。Erik警告說(shuō),如果是基于Future編程,那么不要wait。但是在async塊里除外,因?yàn)閍sync本身是異步的所以不會(huì)阻塞。另外,async/await在模塊scala-async里,需要加到sbt的依賴?yán)铩?/p>

import scala.async.Async.{async, await}def sequence[T](fs: List[Future[T]]): Future[List[T]] = async {  var _fs = fs  val result = ListBuffer[T]()  while (_fs != Nil) {    result += await { _fs.head }    _fs = _fs.tail  }  result.toList}

感謝各位的閱讀,以上就是“Future的sequence怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Future的sequence怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI