这是POC代码:
object TypeTest extends Application {
val stuff = List(1,2,3,4,5)
def joined:String = stuff.reduceLeft(_ + ", " + _)
println(joined)
}
Run Code Online (Sandbox Code Playgroud)
编译时,它会出现以下错误:
tt.scala:4: error: type mismatch;
found : java.lang.String
required: Int
def joined:String = stuff.reduceLeft(_ + ", " + _)
^
tt.scala:4: error: type mismatch;
found : Int
required: String
def joined:String = stuff.reduceLeft(_ + ", " + _)
^
Run Code Online (Sandbox Code Playgroud)
编写连接函数就好
reduceLeft(_.toString + ", " + _.toString)
Run Code Online (Sandbox Code Playgroud)
没有帮助,仍然给出了同样的错误.但是,如果我写它就好
def joined:String = stuff.map(_.toString).reduceLeft(_ + ", " + _)
Run Code Online (Sandbox Code Playgroud)
一切都好.
有人可以解释这种奇怪的类型错误组合吗?这是怎么回事?第二个特别奇怪,因为Int到String的隐式转换.
reduceLeft需要功能块(在括号内)返回与集合相同的类型.这是因为递归调用块直到消耗了集合的所有值.
stuff是List [Int],但是(_ +","+ _)是一个String,因此类型错误.
与reduceLeft类似的方法是foldLeft.区别在于集合类型和结果类型可以不同.例如:
stuff.foldLeft("") { _ + ", " + _ } // => java.lang.String = , 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)
我想你的例子是指示性的,但如果你真的想要一个逗号分隔值的字符串,那么以下会更好:
stuff.mkString(", ") // => String = 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |