对于不可变的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。另外我问的是使用这两种方法的不同方式。
答案 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函数会收到一个值(显然可能是Tuple
)f: (A) ⇒ B
因此,如果您想以不同的方式对待并以易于阅读的方式使用案例词。
你也可以做这样的事情,但不太可饶恕:
original.map(r => (r._1, r._2+1))
答案 2 :(得分:1)
转换采用具有两个值作为输入的函数,第一个是键,第二个是值。不需要模式匹配,因为这两个值是单独传递的。
另一方面,传递给map的函数接受一个元组,该元组包含元素的键和值作为输入。模式匹配用于将此元组分解为其组件。您不必使用模式匹配,但这意味着使用元组对象而不是它的内容。