将 map 对象作为可迭代对象的 map 方法的参数传递

Passing a map object as parameter of the map method of an iterable

我喜欢 Scala 的一点是,我经常通过尝试对我来说似乎很直观的东西来发现新的语法。例如,我不得不解码一个文本,其中每个字符都被不同的符号替换,所以我按照这个简化的例子做了:

val map = Map[Char,Char]('h' -> 'd', 'e' -> 'l', 'l' -> 'o', 'w' -> 'r', 'o' -> 'h', 'r' -> 'd', 'd' -> 'e')
println("hello world".split("\s+").map(word => word.map(map).mkString).mkString(" "))

而且效果很好。我查看了 Array.map 的文档以了解它是如何完成的(我希望看到一些隐式转换或类似的东西)但我什么也没找到。有人可以解释一下如何将 Map 作为参数而不是函数传递吗?

在 scala 中,Map 实际上扩展了 Function1(通过其 MapLike 父级)。 Map[A,B]实际上是一个Function1[A,B],同理,List[A]是一个Function1[Int,A],Set[A]是一个Function1[A, Boolean],这些都可以作用作为函数。

scala> val m : Int => String = Map(1 -> "a", 2 -> "b")
m: Int => String = Map(1 -> a, 2 -> b)

scala> m(1)
res0: String = a

嗯,如果你看一下 Docs,你会发现 Map 实际上扩展了 Function1,它的 apply 方法直观地定义为 [=18] =] 键映射的值。所以 foo.map(map) 等同于 foo.map(bar => map(bar))