foldLeft的替代品,从第二个元素开始

时间:2011-02-28 11:47:18

标签: scala fold

我将List定义为:

val l = List("1", "2", "3")

我想将其转换为字符串

"1:2:3"

以下是一种方法:

l.foldLeft("")((x, y) => x + (if (x == "") "" else ":") +y)

有更优雅的方法吗?

[编辑:进一步说明]

l的元素具有“有意义的”toString方法时,Easy Angel的答案有效。

虽然我lList[String]l可以是自定义类型的列表,但不会覆盖toString方法,例如:

class my(i:Int) {
  val x = i
}

我还有一个方法

def getMy(m:my) = "Hello "+m.x

所以我希望使用getMy的输出而不是默认toString方法的输出。

3 个答案:

答案 0 :(得分:8)

您可以使用mkString的{​​{1}}方法:

List

更多信息可以在scaladoc中找到:

http://www.scala-lang.org/api/rc/scala/collection/Iterable.html#mkString:String


作为替代方案,您可以使用l mkString ":" 例如:

reduceLeft

作为对第二个问题的回答:只需将其与l.reduceLeft(_ + ":" + _)

结合使用即可
map

答案 1 :(得分:2)

使用foldLeft执行此操作的另一种方法:

l.tail.foldLeft(l.head)( (x, y) => x+":"+y )

答案 2 :(得分:1)

其他建议更好,但是当您想保留foldLeft时,可以使用选项:

List("1","2","3").foldLeft(None:Option[String])((o,n)=> o.map(_+":"+n).orElse(Some(n))).get
//res2: String = 1:2:3