Использование функции "map" на карте в Scala

Прежде всего, извиняюсь за хромой вопрос. Я читаю ` Scala для нетерпения 'религиозно и пытаюсь решить все вопросы упражнений (и делать некоторые минимальные исследования)

Фон: Вопрос упражнений идет следующим образом: - Настройте карту цен для ряда вещей, которые вы жаждете. Затем создайте вторую карту с теми же ключами и цены со скидкой 10%.

К сожалению, на данный момент большинство частей scaladoc по-прежнему загадочны для меня, но я понимаю, что функция map из Map принимает функцию и возвращает другую карту после применения функции (я думаю?) - def map[B](f: (A) ⇒ B): HashMap[B]. Я пробовал поиск по Google, но не смог получить много полезных результатов для map function for Map in scala: -)

Мой вопрос: Как было сделано в моем варианте 3, использование функции Map для этой цели имеет смысл или я должен придерживаться варианта 2, который фактически решает мою проблему.

Код:

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

Ответ 1

В этом случае mapValues ​​кажется более подходящим методом. Вы должны использовать метод карты, когда вам нужно выполнить преобразование, требующее знания ключей (например, преобразование ссылки продукта в название продукта, скажем).

Тем не менее, метод карты более общий, поскольку он дает вам доступ к ключам и значениям для вас, и вы можете эмулировать метод mapValues, просто преобразуя значения и передавая ключи через нетронутый - и это где вы ошибаетесь в своем коде выше. Чтобы правильно использовать метод карты, вы должны создавать пару (ключ, значение) из вашей функции, а не только ключ:

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

Ответ 2

Это может быть также:

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