首先,为蹩脚的问题道歉.我正在虔诚地阅读"不耐烦的斯卡拉"并试图解决所有的练习题(并进行一些极少的探索)
背景: 运动问题就像 - 设置一些你垂涎的小玩意儿的价格图.然后生成第二张具有相同键的地图,价格为10%折扣.
不幸的是,在这一点上,scaladoc的大多数部分对我来说仍然含糊不清但我明白地图函数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
Run Code Online (Sandbox Code Playgroud)
Sha*_*nds 18
在这种情况下,mapValues似乎更合适的方法.当您需要执行需要知道密钥的转换时(例如,将产品引用转换为产品名称),您可以使用map方法.
也就是说,map方法更通用,因为它允许您访问键和值以供您操作,并且您可以通过简单地转换值并将键传递到未触摸来模拟mapValues方法 - 这就是您的位置在上面的代码中出错了.要正确使用map方法,您应该从函数中生成(键,值)对,而不仅仅是键:
val discGizmos2=gizmos.map{ case (k,v) => (k,v*0.9) } // pass the key through unchanged
Run Code Online (Sandbox Code Playgroud)
它也可以是:
val discGizmos2 = gizmos.map(kv => (kv._1, kv._2*0.9))
Run Code Online (Sandbox Code Playgroud)