2012-10-30 8 views
7

Mam następujący kod:Zasady dotyczące korzystania instrukcję case zniszczeniu krotki w Scala

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

Chcę, aby przekształcić to na mapie. na przykład Map('a' -> Seq(1,2), 'b' -> Seq(3,4)). Więc przystąpić do pisania transformację:

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

Dlaczego klamra po mapie trzeba być {. Kiedy zacząłem, założyłem, że mogę wykonać następujące czynności:

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

Ale to się nie kompiluje.

+2

Przy okazji, możesz użyć 'mapValues'. – incrop

+0

Czy masz przykład? – andyczerwonka

+1

@andyczerwonka Twoją ostatnią linią będzie 'xs.groupBy (_._ 1) .mapValues ​​(v => v.map (_._ 2))' –

Odpowiedz

12

Ponieważ .map method accepts a function

Co pan właściwie napisany jest

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

i { case (k, v) => (k, v.map(_._2)) } jest definicja skrótu wzór pasujący anonimowa funkcja (SLS, §8.5), który jest 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" 
} 

Nie możesz ommit nawiasy klamrowe (tak będziesz stracić funkcję częściowego i Patten pasujący nicity), ale można pominąć zwykłe szelki (i nadal zachowują częściową funkcji) tak jak w poniższym fragmencie:

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

Oczywiście wiemy, że 'map' ma anonimową funkcję. 'listOfIntegers.map (_ * 2)' jest również tego przykładem. – andyczerwonka

Powiązane problemy