2013-07-28 11 views
11

Po pierwsze, przepraszam za kulawe pytanie. Czytam `Scala dla niecierpliwych” religijnie i próbuje rozwiązać wszystkie pytania ćwiczeń (i robi jakieś minimalne poszukiwań)Używanie funkcji `map` na mapie w Scala

Tło: Pytanie ćwiczenie idzie tak - Konfiguracja mapę cen dla wielu Gizmos, który pożądasz. Następnie przygotuj drugą mapę z tymi samymi kluczami, a ceny z 10% zniżką.

Niestety, w tym momencie większość części skaladoku wciąż jest dla mnie zagadkowa, ale rozumiem, że funkcja mapy Map przejmuje funkcję i zwraca inną mapę po zastosowaniu funkcji (chyba?) - def map[B](f: (A) ⇒ B): HashMap[B]. Próbowałem googling, ale nie mogliśmy dostać wiele przydatnych wyników dla map function for Map in scala :-)

moje pytanie: Jako próbę w moim wariancie 3, nie używając map funkcję do tego celu żadnego sensu czy powinienem trzymać się wersji 2, który faktycznie rozwiązuje mój problem.

Kod:

val gizmos:Map[String,Double]=Map("Samsung Galaxy S4 Zoom"-> 1000, "Mac Pro"-> 6000.10, "Google Glass"->2000) 

//1. Normal for/yield 
val discountedGizmos=(for ((k,v)<-gizmos) yield (k, v*0.9)) //Works fine 

//2. Variation using mapValues 
val discGizmos1=gizmos.mapValues(_*0.9) //Works fine 

//3. Variation using only map function 
val discGizmos2=gizmos.map((_,v) =>v*0.9) //ERROR : Wrong number of parameters: expected 1 

Odpowiedz

15

W tym przypadku mapValues ​​wydaje się bardziej odpowiednia metoda. Metodę mapy można użyć, gdy trzeba wykonać transformację, która wymaga znajomości kluczy (np. Konwersja odwołania do produktu na nazwę produktu, powiedzmy).

To powiedziawszy, metoda mapy jest bardziej ogólna, ponieważ daje dostęp do kluczy i wartości, na których możesz działać, i możesz emulować metodę mapValues, po prostu przekształcając wartości i przekazując klucze przez nietknięte - i to jest, gdzie idziesz źle w powyższym kodzie. Aby prawidłowo korzystać z metody mapy, powinno być wytwarzania (klucz, wartość) parę z funkcji, nie tylko kluczowym:

val discGizmos2=gizmos.map{ case (k,v) => (k,v*0.9) } // pass the key through unchanged 
+0

Wow. To ma sens. Wielkie dzięki za poświęcenie czasu, aby wyjaśnić wyraźnie. –

+1

Warto zauważyć, że 'mapValues' tworzy widok na istniejącej mapie, podczas gdy' map' tworzy całą nową mapę. – Daenyth

4

To może być również:

val discGizmos2 = gizmos.map(kv => (kv._1, kv._2*0.9)) 
+0

Nice. Uwielbiam sposób, w jaki Scala pozwala ci robić to samo na wiele sposobów. Dzięki !! –

+0

jest to odpowiednik użycia krotki .. tj. Kv jest po prostu krotką. – piyushGoyal

Powiązane problemy