我经常编写相同的代码来分区一系列元组:
def groupBy[A, B](s: Seq[(A, B)]) : Map[A, Seq[B]] = s.groupBy (_._1) map { case (k, values) => (k, values.map(_._2))}
有更好的方法吗?
答案 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仅为List
或Vector
等具体类型提供类型类实例,因此您只能使用Seq
,而不是def groupBy[S[_]: Foldable, A, B](s: S[(A, B)]) =
s foldMap {t => Map(t._1 → List(t._2))}
。如果您想要通用版本,可以明确使用类型类:
List
这适用于Vector
,S[_]: Foldable
或通常任何Seq
- 但仍然不是{{1}},您不知道具体类型。