假设我有一段这样的代码:
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
不安全。您将如何改善它?
答案 0 :(得分:2)
原则上,您只能 collect
那些序列为非空的A
,然后将其转换为同时具有建设性意义的值序列非空的证明:
def groupByHead(as: Seq[A]) =
as.collect { case a @ A(h +: t) => (h, a) }.groupBy(_._1).mapValues(_.map(_._2))
但是看起来有点虚假。在这种特殊情况下,“不安全的” .head
似乎是邪恶的,在filter
和groupBy
之间没有太多可能出错的地方。
答案 1 :(得分:2)
如何?
def groupByHead(as: Seq[A]): Map[Int, Seq[A]] =
as.groupBy(_.xs.headOption).collect{ case (Some(key), x) => key -> x }