我有一个整数列表,我想做一个字符串。
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
是一个更好的选择。