Scala:使用String的reduceLeft

Fel*_*ans 4 scala

我有一个整数列表,我想制作一个字符串.

var xs = list(1,2,3,4,5)
(xs foldLeft "") (_+_)               // String = 12345
Run Code Online (Sandbox Code Playgroud)

使用foldLeft它完美,但我的问题是它是否也适用于reduceLeft?如果是,怎么样?

Rég*_*les 8

它无法以这种方式工作reduceLeft.非正式地,您可以查看累积值与集合元素的类型相同reduceLeft的特殊情况foldLeft.因为在您的情况下元素类型是Int和累计值String,所以没有办法以reduceLeft您使用的方式使用foldLeft.

但是,在这种特定情况下,您可以简单地将所有Int元素转换为String预先,然后减少:

scala> xs.map(_.toString) reduceLeft(_+_)
res5: String = 12345
Run Code Online (Sandbox Code Playgroud)

请注意,如果列表为空,这将引发异常.这是另一个区别foldLeft,它处理空案例就好了(因为它有一个明确的起始值).这也是效率较低的,因为我们创建了一个全新的(字符串)集合,只是为了在现场减少它.总而言之,foldLeft这里是一个更好的选择.