Scala - 如何在没有模式匹配的情况下对元组列表进行分组?

时间:2012-10-08 14:43:32

标签: scala group-by tuples

考虑以下结构(实际上结构有点复杂):

case class A(id:String,name:String) {
   override def equals(obj: Any):Boolean = {
      if (obj == null || !obj.isInstanceOf[A]) return false
      val a = obj.asInstanceOf[A]
      name == a.name
   }

   override def hashCode() = {
      31 + name.hashCode
   }
}

val a1 = A("1","a")
val a2 = A("2","a")
val a3 = A("3","b")
val list = List((a1,a2),(a1,a3),(a2,a3))

现在让我们说我想把所有元组分成相同的A组。我可以像这样实现它

list.groupBy {
  case (x,y) => (x,y)
}

但是,我不想在这里使用模式匹配,因为它不会在这里添加任何内容。我想要一些简单的东西,比如:

list.groupBy(_)

不幸的是,这并没有编译。甚至在我这样做的时候:

list.groupBy[(A,A)](_)

有关如何简化代码的任何建议吗?

2 个答案:

答案 0 :(得分:8)

list.groupBy { case (x,y) => (x,y) }

在这里,你将元组解构为它的两个组成部分,只是为了立即重新组装它们,就像以前一样。换句话说:你实际上并没有做任何有用的事情。输入和输出是相同的。这与

相同
list.groupBy { t => t }

当然只是身份功能,Scala帮助我们提供:

list groupBy identity

答案 1 :(得分:4)

如果要根据自己的equals方法对列表元素进行分组,只需将身份函数传递给groupBy:

list.groupBy(x=>x)

由于list.groupBy(_)的范围而写_是不够的,因为它会被x => list.groupBy(x)所取代,这当然不是你想要的。