在scala中分区一系列元组

时间:2015-03-05 17:14:50

标签: scala

我经常编写相同的代码来分区一系列元组:

def groupBy[A, B](s: Seq[(A, B)]) : Map[A, Seq[B]] = s.groupBy (_._1) map { case (k, values) => (k, values.map(_._2))}

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

Scalaz foldMap更清晰,但效率可能更低:

import scalaz._, Scalaz._

def groupBy[A, B](l: List[(A,B)]) = l foldMap {t => Map(t._1 → List(t._2))}

由于Scalaz仅为ListVector等具体类型提供类型类实例,因此您只能使用Seq,而不是def groupBy[S[_]: Foldable, A, B](s: S[(A, B)]) = s foldMap {t => Map(t._1 → List(t._2))} 。如果您想要通用版本,可以明确使用类型类:

List

这适用于VectorS[_]: Foldable或通常任何Seq - 但仍然不是{{1}},您不知道具体类型。