在Scala中调用地图函数的不同方式

时间:2018-09-22 09:33:18

标签: scala

我的功能是

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))

1 个答案:

答案 0 :(得分:5)

listOfFullNamesList个元组。元组是单个实体。 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