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

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


使用foldLeft可以完美工作,但是我的问题是它也可以与reduceLeft一起使用吗?如果是的话,如何?

最佳答案

reduceLeft不能以这种方式工作。非正式地,您可以将reduceLeft视为foldLeft的特例,其中累计值与集合元素的类型相同。因为在您的情况下,元素类型为Int,累计值为String,所以无法像使用reduceLeft那样使用foldLeft

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

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


请注意,如果列表为空,则将引发异常。这是foldLeft的另一个区别,它可以很好地处理空情况(因为它有一个明确的起始值)。
这也不太有效,因为我们只是创建了一个全新的(字符串)集合来减少它。
总而言之,foldLeft是一个更好的选择。

08-20 03:59