在Scala中使用Map上的`map`函数

时间:2013-07-28 13:59:12

标签: scala map

首先,为蹩脚的问题道歉。我正在虔诚地阅读“不耐烦的斯卡拉”并试图解决所有的练习题(并进行一些最小的探索)

背景: 运动问题就像 - 设置一些你垂涎的小玩意儿的价格图。然后生成第二张具有相同键的地图,价格为10%折扣。

不幸的是,在这一点上,scaladoc的大多数部分对我来说仍然含糊不清但我明白Map的map函数接受一个函数并在应用函数后返回另一个映射(我猜?) - def map[B](f: (A) ⇒ B): HashMap[B]。我试过谷歌搜索,但无法为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

2 个答案:

答案 0 :(得分:18)

在这种情况下,mapValues似乎更合适的方法。当您需要执行需要知道密钥的转换时(例如,将产品引用转换为产品名称,比如说),您可以使用map方法。

也就是说,map方法更通用,因为它允许您访问键和值以供您操作,并且您可以通过简单地转换值并通过未触及的键来模拟mapValues方法 - 并且是你上面的代码出错的地方。要正确使用map方法,您应该从函数中生成(键,值)对,而不仅仅是键:

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

答案 1 :(得分:6)

也可以:

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