scala - 如何拆分列表[Either[A, B]]

标签 scala either

我想拆分一个 List[Either[A, B]]在两个列表中。

有没有更好的办法 ?

def lefts[A, B](eithers : List[Either[A, B]]) : List[A] = eithers.collect { case Left(l) => l}
def rights[A, B](eithers : List[Either[A, B]]) : List[B] = eithers.collect { case Right(r) => r}

最佳答案

不确定这真的更整洁,但是:

scala> def splitEitherList[A,B](el: List[Either[A,B]]) = {
         val (lefts, rights) = el.partition(_.isLeft)
         (lefts.map(_.left.get), rights.map(_.right.get))
       }
splitEitherList: [A, B](el: List[Either[A,B]])(List[A], List[B])

scala> val el : List[Either[Int, String]] = List(Left(1), Right("Success"), Left(42))
el: List[Either[Int,String]] = List(Left(1), Right(Success), Left(42))

scala> val (leftValues, rightValues) = splitEitherList(el)
leftValues: List[Int] = List(1, 42)
rightValues: List[String] = List("Success")

关于scala - 如何拆分列表[Either[A, B]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26576530/

相关文章:

scala - 传递数组列表 : Not found value 时在 Scala 模板中编译错误

scala - scala 中类型参数的伴生对象的类型约束

Haskell 返回 Either Double Bool

scala - 如何在Either中累积错误?

scala - Scala是否真的是Monad

scala - 如何在 Scala 中解析导入的名称? ( Spark /齐柏林飞艇)

scala - scala 中的类型不匹配错误以供理解

scala - SBT:如何使子项目在开发期间相互依赖,以及在作为 Maven 工件发布时如何相互依赖?

c - 使用 union 处理错误

scala - 如何使用类型级别的猫将 `Either[Error, Option[Either[Error, Account]]]` 转换为 `Either[Error, Option[Account]]`?