Scala中map(f)与map(_.f)的区别及map(toString)异常结果成因
Scala中
map(toString)和map(_.toString)的差异原因 二者传入map的参数本质完全不同,是Scala标识符解析规则和隐式转换共同导致的差异:
a.map(toString)的实际执行逻辑
- 独立书写的
toString标识符会优先解析为当前上下文下this对象的无参toString方法,首先执行该方法得到一个String类型的返回值。 List[Int]的map方法要求入参是Int => 任意类型的函数,而Scala中String默认隐式兼容Int => Char的函数类型:字符串(下标)等价于调用字符串.charAt(下标),返回对应索引位置的字符。- 你的示例中List元素为1、2、3,相当于依次将1、2、3作为下标,传入
this.toString返回的字符串中取字符,最终得到三个字符的列表。 - 你看到的
l、i、n就是当前上下文this的toString结果里,索引为1、2、3位置的三个字符。你可以直接在REPL中执行println(toString)查看完整字符串,核对索引位置的字符即可验证。
a.map(_.toString)的执行逻辑
这个写法显式定义了匿名函数x => x.toString,是对List中的每个Int元素自身调用toString方法,因此得到的就是1、2、3转换为字符串的结果。
逻辑验证
你可以运行以下代码复现你遇到的输出,确认逻辑正确:
val testStr = "xline_test" println(List(1,2,3).map(testStr)) // 输出:List(l, i, n)
内容的提问来源于stack exchange,提问作者gefei
相关产品推荐
相关产品推荐

