14

首先,为这个蹩脚的问题道歉。我正在认真阅读“为不耐烦的人准备的 Scala”,并尝试解决所有练习题(并进行一些最小的探索)

背景: 练习题是这样的 - 为您梦寐以求的一些小玩意设置价格地图。然后生成具有相同键和 10% 折扣价格的第二张地图。

不幸的是,在这一点上,scaladoc 的大部分部分对我来说仍然很神秘,但我知道 map 的函数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
4

2 回答 2

20

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

也就是说,map 方法更通用,因为它让您可以访问键和值以供您操作,并且您可以通过简单地转换值并将键传递给 untouched 来模拟 mapValues 方法 - 这就是您上面的代码出错了。要正确使用 map 方法,您应该从您的函数中生成一个 (key, value) 对,而不仅仅是一个键:

val discGizmos2=gizmos.map{ case (k,v) => (k,v*0.9) } // pass the key through unchanged
于 2013-07-28T14:16:08.683 回答
9

它也可以是:

val discGizmos2 = gizmos.map(kv => (kv._1, kv._2*0.9))
于 2013-07-28T22:50:37.250 回答