7

私は次のコードを持っています:

val xs = List(('a', 1), ('a', 2), ('b', 3), ('b', 4))

これをマップに変換したいと思います。例:Map('a' -> Seq(1,2), 'b' -> Seq(3,4))。だから私は変換を書き始めます:

xs.groupBy(_._1) map {
  case (k, v) => (k, v.map(_._2))
}

マップの後のブレースがである必要があるのはなぜですか{。私が始めたとき、私は次のことができると思いました:

xs.groupBy(_._1).map(case (k, v) => (k, v.map(_._2)))

しかし、それはコンパイルされません。

4

2 に答える 2

12

.mapメソッドは関数を受け入れるため

あなたが実際に書いたのは

map({
  case (k, v) => (k, v.map(_._2))
})

そして、これは、関数の種類の1つであるパターンマッチング無名関数SLS、§8.5){ case (k, v) => (k, v.map(_._2)) }のショートカット定義です。

val isOdd: PartialFunction[Int, String] = {
   case x if x % 2 == 1 => x+" is odd"
}

val upcastedIsOdd: Function[Int, String] = {
   case x if x % 2 == 1 => x+" is odd"
}

中括弧を省略することはできません(したがって、部分的な機能とパッテンの一致するニシティを失うことになります)が、以下のスニペットのように、単純な中括弧をスキップできます(そして部分的な機能を保持します)。

scala> List(1,2,3).take(1)
//res0: List[Int] = List(1)
scala> List(1,2,3) take 1
//res1: List[Int] = List(1)
于 2012-10-30T00:34:24.770 に答える
2

ここでの本当の問題は、無名関数を表すため(に中括弧の代わりに括弧を使用できるのはいつかということのようです。質問に対する{DanielSobralの回答を確認することをお勧めします。中括弧と括弧のScalaの形式的な違いは何ですか、またいつ使用する必要がありますか?

于 2012-10-30T22:13:58.047 に答える