3

我有一个List定义为:

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

我想把它转换成字符串

"1:2:3"

一种方法如下:

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

有没有更优雅的方法?

[编辑:进一步解释]

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

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

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

我也有方法

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

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

4

3 回答 3

9

您可以使用以下mkString方法List

l mkString ":"

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

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


作为替代方案,您可以使用reduceLeft例如:

l.reduceLeft(_ + ":" + _)

作为对第二个问题的回答:只需将其与map

l map getMy mkString ":"
于 2011-02-28T11:49:51.180 回答
2

仅使用 foldLeft 的另一种方法:

l.tail.foldLeft(l.head)( (x, y) => x+":"+y )
于 2011-02-28T12:07:11.270 回答
1

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

List("1","2","3").foldLeft(None:Option[String])((o,n)=> o.map(_+":"+n).orElse(Some(n))).get
//res2: String = 1:2:3
于 2011-02-28T12:11:28.930 回答