嗨,我是斯卡拉的新手,当然还有一个新手问题, 为什么下划线字符在这种情况下不起作用 在这种情况下,我对下划线的承诺代表了列表中的一个元素
val listOftuple = List(("cat","tom"),("mouse","jerry"),("dog","spike"))
val listOfarray = List(Array("cat","tom"),Array("mouse","jerry"),Array("dog","spike"))
tuplelist.map(it=>it._1+it._2) //Ok
tuplelist.map(_._1+_._2) //Not work, give me: error: missing parameter type for expanded function
listOfarray.map(_.length) //Here work, like array.length
listOfarray.map(it=>it(0)+it(1)) //Ok
listOfarray.map(_=>_(0)+_(1))//Not work, give me: error: missing parameter type for expanded function
listOfarray.map(_(0)+_(1))//Not work, give me: error: missing parameter type for expanded function
可能是我陷入了词汇误解? 如何修复错误消息? 问候
答案 0 :(得分:1)
tuplelist.map(_._1+_._2)
每次使用_
时,它代表另一个参数。也就是说,_ + _
相当于(x,y) => x+y
,而不是x => x+x
。所以上面等同于tuplelist.map((x, y) => _._1 + _._2)
,这不起作用,因为map
期望一个函数只接受一个参数。
listOfarray.map(_=>_(0)+_(1))
使用_
作为函数参数的名称只意味着将忽略该参数。在函数体内使用_
时,它仍然是函数快捷方式运算符,而不是对被忽略参数的引用。所以上面的lambda相当于ignoredParam => (x, y) => x + y
。
listOfarray.map(_(0)+_(1))
(x,y) => x(0) + y(1)
,但您需要x => x(0) + x(1)
。
如何修复错误消息?
在所有这些情况下,使用显式参数列表是正确的解决方案。如果要多次使用相同的参数,则无法使用快捷方式表示法。