Scala:使用String的reduceLeft

时间:2015-07-07 15:12:16

标签: scala

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

var xs = list(1,2,3,4,5)
(xs foldLeft "") (_+_)               // String = 12345

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

2 个答案:

答案 0 :(得分:8)

reduceLeft无法以这种方式运作。非正式地,您可以将reduceLeft视为foldLeft的特殊情况,其中累积值与集合元素的类型相同。因为在您的情况下,元素类型为Int且累计值为String,因此您无法像使用reduceLeft一样使用foldLeft

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

scala> xs.map(_.toString) reduceLeft(_+_)
res5: String = 12345

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

答案 1 :(得分:3)

确保正确理解类型需要一些工作。但是,扩展它们可以使用类似的东西:

(xs reduceLeft ((a: Any, b: Int) => a + b.toString)).toString