然后scala groupBy类映射结果

时间:2017-03-03 01:15:04

标签: scala types

我有一个元素列表,希望按类分组,然后处理结果。

trait H 
case class A(x: Int) extends H
case class B(x: Int) extends H
val x = List(A(1),B(2),B(3))
val y = x.groupBy(_.getClass)

y.map(_ match {case (A, alist) => println("found me some As")
               case (B, blist) => println("not As")})

不幸的是,这会产生如下错误:

<console>:17: error: pattern type is incompatible with expected type;
 found   : A.type
 required: Class[_ <: Product]
Note: if you intended to match against the class, try `case _: A`
       y.map(_ match {case (A, alist) => println("found me some As")

也就是说,当匹配的项目而不仅仅是一个实例时,我似乎无法找到正确匹配大小写的方法。< / p>

部分解决方案如下:

val z = y.map(_ match {case (atype, alist) => alist })
z.map(_ match {
  case alist if alist.head.isInstanceOf[A] => alist 
  case blist => List()
})

但感觉应该有更好的方法来使用从Map返回的初始groupBy的键。

1 个答案:

答案 0 :(得分:4)

A中的

case (A, alist)引用A的伴随对象,其类型为A.type。这就是你收到错误信息的原因。如果要与类元数据匹配,则应参考classOf[A]。也没有理由使用match,因为您已经可以与map进行模式匹配。

y.map {
    case (c, alist) if(c == classOf[A]) => println("found me some As")
    case (c, blist) if(c == classOf[B]) => println("not As")
}