3

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

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)](_)

有什么建议可以简化我的代码吗?

4

2 回答 2

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

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

list.groupBy { t => t }

这当然只是标识函数,Scala 为我们提供了帮助:

list groupBy identity
于 2012-10-08T15:37:09.283 回答
4

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

list.groupBy(x=>x)

list.groupBy(_)由于 的范围,写是不够的_,那就是它会被取消x => list.groupBy(x),这当然不是你想要的。

于 2012-10-08T14:50:19.190 回答