从Scala 2.13 开始,大多数集合都提供了partitionMap 方法,该方法基于将项目映射到Right 或Left 的函数来划分元素。
在我们的例子中,我们甚至不需要将输入转换为Right 或Left 的函数来定义分区,因为我们已经有了Rights 和Lefts。因此简单地使用identity!
那么这只是一个根据是否有左来匹配得到的左和右分区元组的问题:
eithers.partitionMap(identity) match {
case (Nil, rights) => Right(rights)
case (firstLeft :: _, _) => Left(firstLeft)
}
// * val eithers: List[Either[String, Int]] = List(Right(1), Right(2), Right(3))
// => Either[String,List[Int]] = Right(List(1, 2, 3))
// * val eithers: List[Either[String, Int]] = List(Right(1), Left("error1"), Right(3), Left("error2"))
// => Either[String,List[Int]] = Left("error1")
中间步骤详情(partitionMap):
List(Right(1), Left("error1"), Right(3), Left("error2")).partitionMap(identity)
// => (List[String], List[Int]) = (List("error1", "error2"), List(1, 3))