2011-02-28 34 views
1

开始我有一个List定义为:到foldLeft的替代,从第二元件

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

我想将其转换成字符串

"1:2:3" 

的一种方式是执行以下操作:

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

有没有更优雅的方法?

[编辑:进一步解释]

易天使的回答工作时的l元素有一个“有意义” toString方法。

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

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

我也有一个方法

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

所以我想用getMy的输出代替默认toString方法的输出。

回答

8

可以使用的ListmkString方法:

l mkString ":" 

更多信息可在scaladoc发现:

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


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

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

作为一个回答你的第二个问题:只是map结合起来:

l map getMy mkString ":" 
+0

感谢您使用'map'的解决方案。为了清楚起见,我会把它写成'(l map getMy)mkString“:”'。我感到很蠢,因为我没有想到自己。 – Jus12 2011-02-28 12:08:57

+0

@ Jus12:它不是优雅和简洁。哦......我爱斯卡拉:) – tenshi 2011-02-28 12:12:18

+0

是的,非常优雅,虽然其他答案也很好。例如,他们可以用来做更多的通用的东西,除了形式转换为字符串。顺便说一句,是的,斯卡拉真棒! – Jus12 2011-02-28 16:48:45

1

另一种方式只foldLeft做到这一点:

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

这也是一个非常好的解决方案! – Jus12 2011-02-28 12:32:07

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