【发布时间】:2021-01-19 17:11:07
【问题描述】:
如何将 Iterable 的 Try 值转换为 Iterable 的 Try? 如果 Iterable 包含失败,则应返回第一个失败,如果没有失败则返回应返回可迭代的 Success 值。
例如,假设转换函数被称为squash:
import scala.util.{Try, Success, Failure}
def squash[U](iterable : Iterable[Try[U]]) : Try[Iterable[U]] = ???
包含失败的 Iterable 的预期行为:
val containsFailure : Iterable[Try[Int]] =
Iterable[Try[Int]](Success(42), Failure(new Exception("foo")), Success(43), Failure(new Exception("bar")))
assert(squash(containsFailure) == Failure(new Exception("foo")))
以及没有失败的 Iterable 的预期行为:
val noFailures : Iterable[Try[Int]] =
Iterable[Try[Int]](Success(42), Success(43), Success(44))
assert(squash(noFailures) == Success(Iterable(42,43,44)))
我正在寻找仅包含标准 scala 功能的解决方案,请不要将 scalaz 或 cats 等库作为答案的一部分。
提前感谢您的考虑和回复。
【问题讨论】:
-
您是否愿意使用外部库和/或更改您的类型?
-
@LuisMiguelMejíaSuárez 没有外部库,只有 scala 原生功能。我会相应地更新我的问题。
-
这里有几个替代方案:scastie.scala-lang.org/BalmungSan/CD9okV0fTBeKmt3JV6DnSQ/14 - 顺便说一句,虽然我同意只为一个功能包含像 cats 这样的东西是不好的,在某一时刻有考虑你要重新实现多少东西。
标签: scala