使用mkString和foldRight合并字符串列表

时间:2013-05-08 18:28:31

标签: scala functional-programming string-concatenation

我目前正在Scala中尝试一些事情,试图习惯于函数式编程以及再次学习一门新语言(自上次以来已经有一段时间了)。

现在给出一个字符串列表,如果我想将它们合并为一个长字符串(例如"scala", "is", "fun" => "scalaisfun"),我认为一种方法是做foldRight并在各自应用串联元素。另一种方式,无论如何更简单,就是致电mkString

我在github上查了但是找不到相应功能的源代码(对此有任何帮助都会受到赞赏),所以我不确定这些功能是如何实现的。从我的头脑中,我认为mkString更灵活,但感觉在某个地方可能会有foldRight。这有什么道理吗?

否则scaladocs提到mkString为每个相应元素调用toString。看到它们已经是字符串开头,在这种特殊情况下,这可能是mkString的一个负面因素。在性能,简洁/优雅等方面对这两种方法的优缺点有何评论?

3 个答案:

答案 0 :(得分:20)

简单回答:使用mkString

someString.toString returns相同的对象。

mkString使用单个StringBuilder实现,它只创建一个新字符串。使用foldLeft,您将创建N-1个新字符串。

您可以在StringBuilder中使用foldLeft,它会跟mkString一样快,但mkString更短:

strings.foldLeft(new StringBuilder){ (sb, s) => sb append s }.toString
strings.mkString // same result, at least the same speed

答案 1 :(得分:6)

除非你确实需要,否则不要使用foldRight,因为它会溢出你的堆栈以​​获取大型集合(对于某些类型的集合)。 foldLeftfold将起作用(不会在堆栈上存储中间数据),但会比mkString更慢,更尴尬。如果列表非空,reducereduceLeft也可以。

答案 2 :(得分:3)

Im memory serve,mkString使用StringBuilder来构建高效的String。你可以使用Scala StringBuilder作为foldRight的累加器来完成相同的事情,但是如果mkString已经为你做了所有好事,为什么还要烦恼呢。加mkString为您提供额外的好处,包括可选的分隔符。您可以在foldRight中执行此操作,但已使用mkString

为您完成此操作