How to split a List[Either[A, B]]

前端 未结 8 1109
南笙
南笙 2020-12-10 11:01

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         


        
相关标签:
8条回答
  • 2020-12-10 11:45

    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 Rights and Lefts. 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)
    
    0 讨论(0)
  • 2020-12-10 11:45

    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 :)

    0 讨论(0)
提交回复
热议问题