2012-10-30 31 views
7

我有以下的代碼來破壞一個元組:規則上使用CASE語句,在斯卡拉

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

我想變成一個Map這一點。例如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))) 

但是,這並沒有編譯。

+2

順便說一句,你可以使用'mapValues'。 – incrop

+0

你有沒有例子? – andyczerwonka

+1

@andyczerwonka你的最後一行將是'xs.groupBy(_._ 1).mapValues(v => v.map(_._ 2))' –

回答

12

因爲.MAP method accepts a function

你實際上已經寫了什麼是

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

{ case (k, v) => (k, v.map(_._2)) }模式匹配匿名函數SLS,第8.5節),這是一個one of the function kinds定義的快捷方式:

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

你不能ommit大括號(所以你會失去部分功能和彭定康匹配nicity),但你可以跳過普通括號(和仍然保留部分功能),就像下面的代碼片段:

scala> List(1,2,3).take(1) 
//res0: List[Int] = List(1) 
scala> List(1,2,3) take 1 
//res1: List[Int] = List(1) 
+1

當然我們知道'map'需要一個匿名函數。 'listOfIntegers.map(_ * 2)'也是一個例子。 – andyczerwonka