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) }

ここでは、タプルを 2 つの構成要素に分解して、以前とまったく同じようにすぐに再構築しています。言い換えれば、実際には何の役にも立たないということです。入力と出力は同じです。これはちょうど同じです

list.groupBy { t => t }

これはもちろん、Scala が便利に提供してくれる ID 関数です。

list groupBy identity
于 2012-10-08T15:37:09.283 に答える
4

リストの要素を独自のequals方法でグループ化したい場合は、ID 関数を groupBy に渡すだけで済みます。

list.groupBy(x=>x)

list.groupBy(_)のスコープのため、書くだけでは十分ではありません。つまり、_に脱糖されるx => list.groupBy(x)ことになります。

于 2012-10-08T14:50:19.190 に答える