1

我有一个与此处提出的问题类似的问题(Multiple or Single Try Catch),但是在我的情况下,出于功能(而不是性能原因),我需要遵循此模式

本质上,我正在处理 Scalatra 中的参数错误,并且我需要一种简单的方法来捕获是否有任何转换失败,而第一次失败则跳过其余的 try 调用

换句话说,我需要遵循这样的模式的东西

  def checkMultiple(a:Seq[Try]):Either[Map[_,Throwable],Map[_,Success]] = {
    ???
  }

我放入了一系列 try 子句。如果其中任何一个失败,它将返回所有失败尝试的映射,而不仅仅是第一个(其中将包含失败的尝试及其异常的映射),否则它将返回所有失败的映射的尝试与其成功值对应

有谁知道是否存在本质上已经做到这一点的一元模式,或者是否有一些实用程序库可以做到这一点?否则您将如何定义上述功能?

4

1 回答 1

3

你可以用普通的 Scala 完成类似的事情,尽管它比使用 Scalaz' 要做更多的工作Validation

def checkMultiple[A,B](data: Seq[A])(f: A => B): Either[Map[A,Throwable], Map[A,B]] = {
  val caught = data.map(a => a -> Try(f(a)))
  val wrong = caught.collect{ case (a, Failure(t)) => a -> t }
  if (!wrong.isEmpty) Left(wrong.toMap)
  else Right(caught.map(x => x._1 -> x._2.get).toMap)
}

这是在工作:

scala> checkMultiple(Seq(1,2,3,4))(x => if (x>4) throw new Exception else x)
res1: scala.util.Either[Map[Int,Throwable],Map[Int,Int]] = 
  Right(Map(1 -> 1, 2 -> 2, 3 -> 3, 4 -> 4))

scala> checkMultiple(Seq(3,4,5,6))(x => if (x>4) throw new Exception else x)
res2: scala.util.Either[Map[Int,Throwable],Map[Int,Int]] = 
  Left(Map(5 -> java.lang.Exception, 6 -> java.lang.Exception))
于 2013-08-29T03:40:11.007 回答