Scala:Map.map和Map.transform之间的区别?为什么Map.map需要在其参数中进行模式匹配?

时间:2018-01-29 08:55:50

标签: scala collections functional-programming

对于不可变的Map

val original = Map("A"->1, "B"->2)

我可以使用

original.map { case (k, v) => (k, v + 1) }

original.transform((_, v) => v + 1)

转换价值。

但为什么map()方法需要case模式匹配,但transform()却没有?是因为这些方法是用不同的隐式类型定义的吗?

有人将我的问题标记为另一个问题的副本[Difference between mapValues and transform in Map。它不一样。我问Map.map而不是Map.mapValues。另外我问的是使用这两种方法的不同方式。

3 个答案:

答案 0 :(得分:3)

使用map方法,您可以更改(不要在此处使用转换字词)整个Map将其转换为另一个Map,{ {1}}等

List

使用val m = Map(1->"a") m.map { case (k,v) => (k+1) -> (v + 1) } // Map(2 -> a1) m.map { case (k,v) => k+v } // List(1a) 方法,您只能更改考虑其键的值

transform

答案 1 :(得分:1)

不同之处在于他们收到的功能。正如您在API

中看到的那样
def transform[W, That](f: (K, V) ⇒ W)(implicit bf: CanBuildFrom[Map[K, V], (K, W), That]): That

def map[B](f: (A) ⇒ B): Map[B]

转换函数会收到一个元组f: (K, V) ⇒ W,而map函数会收到一个值(显然可能是Tuplef: (A) ⇒ B

因此,如果您想以不同的方式对待并以易于阅读的方式使用案例词。

你也可以做这样的事情,但不太可饶恕:

original.map(r => (r._1, r._2+1))

答案 2 :(得分:1)

转换采用具有两个值作为输入的函数,第一个是键,第二个是值。不需要模式匹配,因为这两个值是单独传递的。

另一方面,传递给map的函数接受一个元组,该元组包含元素的键和值作为输入。模式匹配用于将此元组分解为其组件。您不必使用模式匹配,但这意味着使用元组对象而不是它的内容。