我有一堆IOs,所有這些都可能成功或失敗:
val result: Seq[IO[MyFailure, MySuccess]] = ...
我需要的結果,這樣我可以檢查所有的失敗和所有的成就概括起來:
case class MySummary(failures: Seq[MyFailure], successes: Seq[MySuccess])
def makeSummary(results: Seq[IO[MyFailure, MySuccess]]): UIO[MySummary] = ???
起初這看起來與 非常相似foreach,但經過仔細檢查,我發現這在這里沒有幫助。因為Future我通常會使用sequence,因為Seq[Either[A,B]]我可以使用partitionMap. ZIO 中的等效方法是什么?
uj5u.com熱心網友回復:
你不能用 來檢查所有的失敗Future.sequence,如果有的話,你只會找回第一個失敗。
該ZIO等價物Future.sequence將ZIO.collectAll是幾乎等同于ZIO.foreach(result)(identity)。
如果您確實需要累積所有錯誤,那么您可能應該使用ZIO.validate和 進行磁區,還有ZIO.partition.
一些用于比較的代碼:
val result: Seq[IO[MyFailure, MySuccess]] = ???
val withCollectAll: IO[MyFailure, Seq[MySuccess]] = ZIO.collectAll(result)
val withForeach: IO[MyFailure, Seq[MySuccess]] = ZIO.foreach(result)(identity)
val withValidate: IO[::[MyFailure], Seq[MySuccess]] = ZIO.validate(result)(identity) //`::` just means that the list cannot be empty
val withPartition: UIO[(Iterable[MyFailure], Iterable[MySuccess])] = ZIO.partition(result)(identity)
代碼makeSummary有ZIO.partition:
def makeSummary(results: Seq[IO[MyFailure, MySuccess]]): UIO[MySummary] =
ZIO.partition(result)(identity).map { case (f, s) => MySummary(f.toSeq, s.toSeq) }
uj5u.com熱心網友回復:
我不熟悉 ZIO,可能有一種內置的方法可以實作相同的目標。
我會選擇以下內容:
def makeSummary(results: Seq[IO[MyFailure, MySuccess]]): UIO[MySummary] = {
results.foldLeft(ZIO.succeed(MySummary(Seq(), Seq()))) { (acc, io) =>
acc.flatMap { summary =>
io.fold(
err => summary.copy(failures = summary.failures : err),
suc => summary.copy(successes = summary.succcesses : suc)
)
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/396451.html
