map相关问题及匿名函数的问题

来源:互联网 发布:linux service 配置 编辑:程序博客网 时间:2024/06/06 17:15

List(1,2) map { i => println("hi");i+1},对于这个函数其可以写成更精确的形式:List(1,2) map { i => {println("hi");i+1}},后面的两个语句其实是一个函数体,因此输出的结果是hi hi List(2,3)

List(1,2) map { println("hi"); _+1},对于这个函数,其结果为hi List(2,3),这是由于对于使用“_”作为参数的匿名函数,只有包含“_”的部分才是真正的函数,也就是说,前面的函数可以更精确的表示为List(1,2) map { println("hi"); {i => i+1}},因此最终是向map传递了一个匿名函数,其函数体是i+1

List(1,2) map {"abc"},这个表达式返回的结果是List('b','c'),这个结果对于我们来说可能有些奇怪,不过仔细分析一下就可以得到这个结果了,对于int类型的List,其后面的map需要一个函数,这个函数的类型是:int =>Any的类型,其中前面的int是通过List的迭代传过来的值也就是1,2,而函数是一个String类型的字符串,这个时候就会触发一个隐式的转换将String类型的数据转换为scala.collection.immutable.StringOps 的类型,而这个类型有一个override def apply(index: Int): Char = repr charAt index函数,这样上面的map函数的参数就变成了{i =>"abc" charAt i}于是乎就变成了最终的List(b,c)结果了(也可以是"abc".apply(i),由于给一个对象传递一个参数的时候会隐式的调用这个对象的apply方法).

另外还有一点需要提及,在上面的map函数后面有时候我们可以看到(),有时候看到的是{},这两者并没有区别,对于()通常是传递的小型的函数,而对于{},实在代码中明确包含“;”或者换行(也即是隐式的分号)的时候,因此可以用()的地方一定可以用{},如println()其实可以写成println{},尽管这看起来有点奇怪

原创粉丝点击