這個問題在這里已經有了答案: List[Try[T]] to Try[List[T]] in Scala (4 個回答) 4 小時前關閉。
假設我在 Scala 中有一個嘗試串列,例如:List(Try(a), Try(b), Try(c))。如果要撰寫一個代碼片段,如果所有嘗試都成功則回傳 Success(List(a, b, c)) ,如果其中一個嘗試失敗則回傳失敗。
我發現這樣做的唯一方法是:
private def convertArrayOfSuccessesToSuccessOfByteArray(
tryArrayForOutput: Array[Try[Byte]]
): Success[Array[Byte]] = {
val outputArray = ArrayBuffer[Byte]()
tryArrayForOutput.foreach(tryElem => {
val Success(elem) = tryElem
outputArray.append(elem)
})
Success(outputArray.toArray)
}
如您所見,它非常麻煩,而且不是那么“實用”。
uj5u.com熱心網友回復:
只是get每個值并包裹在 a 中Try以捕獲第一個錯誤(如果有)
Try(tryArrayForOutput.map(_.get))
uj5u.com熱心網友回復:
在這種情況下,@Tim 的回答很好。
一種更通用的功能方式是fold和flatMap:
private def convertArrayOfSuccessesToSuccessOfByteArray(tryArrayForOutput: Seq[Try[Byte]]): Try[Seq[Byte]] = {
tryArrayForOutput.foldLeft(Try(Seq[Byte]())) { (acc: Try[Seq[Byte]], t: Try[Byte]) =>
acc.flatMap { seq: Seq[Byte] =>
t.map((b: Byte) => seq : b)
}
}
}
這可以概括,并且通常是由諸如 Cats 之類的庫提供的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/377863.html
標籤:斯卡拉
上一篇:帶有可選引數的多載方法
下一篇:案例類的Scala過濾串列
