I want to split a List[Either[A, B]]
in two lists.
Is there a better way ?
def lefts[A, B](eithers : List[Either[A, B]]) : List[A] = eit
Starting Scala 2.13
, most collections are now provided with a partitionMap method which partitions elements based on a function which returns either Right
or Left
.
In our case, we don't even need a function that transforms our input into Right
or Left
to define the partitioning as we already have Right
s and Left
s. Thus a simple use of identity
:
val (lefts, rights) = List(Right(2), Left("a"), Left("b")).partitionMap(identity)
// lefts: List[String] = List(a, b)
// rights: List[Int] = List(2)
Well, in case it doesn't have to be a one-liner... then it can be a no-brainer.
def split[A,B](eithers : List[Either[A, B]]):(List[A],List[B]) = {
val lefts = scala.collection.mutable.ListBuffer[A]()
val rights = scala.collection.mutable.ListBuffer[B]()
eithers.map {
case Left(l) => lefts += l
case Right(r) => rights += r
}
(lefts.toList, rights.toList)
}
But, to be honest, I'd prefer Marth's answer :)