将 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))
我喜欢 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))