2012-10-30 14 views
7

Ho il seguente codice:Regole sull'utilizzo un'istruzione case per distruggere una tupla a Scala

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

voglio trasformare questo in una mappa. per esempio. Map('a' -> Seq(1,2), 'b' -> Seq(3,4)). Così procedo a scrivere la trasformazione:

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

Perché la coppia dopo la cartina bisogno di essere un {. Quando ho iniziato, ritenevo di poter fare quanto segue:

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

Ma questo non viene compilato.

+2

A proposito, è possibile utilizzare 'mapValues'. – incrop

+0

Hai un esempio? – andyczerwonka

+1

@andyczerwonka l'ultima riga sarà 'xs.groupBy (_._ 1) .mapValues ​​(v => v.map (_._ 2))' –

risposta

12

Perché .map method accepts a function

Quello che hai effettivamente scritto è

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

e il { case (k, v) => (k, v.map(_._2)) } è una definizione scorciatoia per pattern matching funzione anonima (SLS, §8.5) che è 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" 
} 

Non è possibile OMMIT parentesi graffe (così avrete sciolto funzione parziale e Patten genicità, corrispondenza), ma si può saltare bretelle semplici (e conservano ancora la funzione parziale), proprio come nel frammento di seguito:

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

Ovviamente sappiamo che 'map' assume una funzione anonima. 'listOfIntegers.map (_ * 2)' è anche un esempio di questo. – andyczerwonka

Problemi correlati