【发布时间】:2012-10-18 06:12:18
【问题描述】:
我需要将 Iterable[Either[Throwable, String]] 简化为 Either[Throwable, Iterable[String]]。我不知道这个操作是否很常见,在 Iterable 特征上没有发现任何东西。所以我写了这个函数:
def reduce[A, B](xs: Iterable[Either[A, B]]): Either[A, Iterable[B]] =
xs.collectFirst {
case Left(x) => x
} match {
case Some(x) => Left(x)
case None => Right(xs.collect{case Right(y)=> y})
}
如果不是这个,谁能帮我找到更好的方法?
【问题讨论】:
-
你想要实现的转换有点模棱两可。例如,您的输入列表包含一半的
Right[String]s 和一半的各种和异构的Left[Exception]s。您想将其减少为一个异常或字符串列表。如果有例如应该采取哪个例外输入有十个不同? -
你是对的。我只想考虑第一个异常(或任何 Left 值),它将隐藏其他异常,但我的用例可以接受。
标签: scala functional-programming iterable either