考虑以下结构(实际上结构有点复杂):
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)](_)
有关如何简化代码的任何建议吗?
答案 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)
所取代,这当然不是你想要的。