如何改善按人分组

时间:2019-03-05 15:01:12

标签: scala collections

假设我有一段这样的代码:

case class A(xs: Seq[Int])

def groupByHead(as: Seq[A]): Map[Int, Seq[A]] = 
  as.filter(_.xs.nonEmpty).groupBy(_.xs.head)

groupByHead可以,但是我不喜欢groupBy(_.xs.head),因为head不安全。您将如何改善它?

2 个答案:

答案 0 :(得分:2)

原则上,您只能 collect那些序列为非空的A,然后将其转换为同时具有建设性意义的值序列非空的证明:

def groupByHead(as: Seq[A]) = 
  as.collect { case a @ A(h +: t) => (h, a) }.groupBy(_._1).mapValues(_.map(_._2))

但是看起来有点虚假。在这种特殊情况下,“不安全的” .head似乎是邪恶的,在filtergroupBy之间没有太多可能出错的地方。

答案 1 :(得分:2)

如何?

def groupByHead(as: Seq[A]): Map[Int, Seq[A]] = 
  as.groupBy(_.xs.headOption).collect{ case (Some(key), x) => key -> x }