我的功能是
val f2 : (String, String) => Int = new Function2[String, String, Int] {
def apply(s1 : String, s2 : String) = s1.length + s2.length
}
为什么我不能在Scala中做到这一点
val listOfFullNames = List(("Mark","Smith"), ("Jim","Duggan"), ("Eddie","Murphy"), ("Sylvester","Stallone"))
val output3 = listOfFullNames.map(f2)
错误消息很有趣,它表示预期:(字符串,字符串)=> TypeInferredB,但是实际的(字符串,字符串)=> Int
//But this works fine
val output3 = listOfFullNames.map(x => f2(x._1, x._2))
我这样做的原因纯粹是因为,它有效
val f :String => Int = new Function[String, Int] {
def apply(s : String) = s.length
}
可以这样使用
val listOfNames = List("Mark", "Jim", "Eddie", "Sylvester","Stallone")
val output = listOfNames.map(f)
只想知道以下用法之间的区别。
list.map(_.lowercase)
list.map(f)
listOfFullNames.map(x => f2(x._1, x._2))
答案 0 :(得分:5)
listOfFullNames
是List
个元组。元组是单个实体。 f2()
需要2个单独的String
参数,因此它不会接受元组。
如果仔细查看错误消息,您会注意到found: (String,String)
和required: ((String,String))
之间的区别。
如前所述,f2.tupled
将采用(String,String)
类型的单个元组。
val output3 = listOfFullNames.map(f2.tupled) //this works
顺便说一句,f2()
可以更简洁地表达。
val f2 :(String, String) => Int = _.length + _.length