在Scala中对Map使用`map`函数

16

首先,对于这个问题的提问可能有些愚蠢,我正在虔诚地阅读《Scala for the Impatient》并尝试解决所有的练习题(并进行一些最低限度的探索)

背景: 练习题是这样的-设置一个价格映射表,包括你渴望得到的一些小玩意儿。然后创建第二个映射表,其中包含相同的键和以 10% 折扣的价格。

不幸的是,到目前为止,大多数 scaladoc 都对我来说仍然很难懂,但我了解到 Map 的 map 函数接收一个函数并在应用函数后返回另一个映射表(我猜?)- def map[B](f: (A) ⇒ B): HashMap[B]。我尝试过搜索 "scala 中的 map 函数",但没找到有用的结果 :-)

我的问题: 像我在 variation 3 中所尝试的那样,使用 map 函数是否有任何意义,或者应该坚持 variation 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个回答

23

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

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

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

1
值得注意的是,mapValues 创建了现有映射上的视图,而 map 则创建了一个全新的映射。 - Daenyth
“map” 不需要返回元组了,至少现在不需要了。结果是一个可迭代对象。 - Saskia
1
为什么那里有一个 case 关键字? - Lucas Lima

9

它也可以是:

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

很好。我喜欢Scala允许你用多种方式做同一件事的方式。谢谢!! - Arun Manivannan
这相当于使用元组,即kv只是一个元组。 - piyushGoyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接