我目前正在Scala中尝试一些事情,试图习惯于函数式编程以及再次学习一门新语言(自上次以来已经有一段时间了)。
现在给出一个字符串列表,如果我想将它们合并为一个长字符串(例如"scala", "is", "fun" => "scalaisfun"
),我认为一种方法是做foldRight
并在各自应用串联元素。另一种方式,无论如何更简单,就是致电mkString
。
我在github上查了但是找不到相应功能的源代码(对此有任何帮助都会受到赞赏),所以我不确定这些功能是如何实现的。从我的头脑中,我认为mkString
更灵活,但感觉在某个地方可能会有foldRight
。这有什么道理吗?
否则scaladocs提到mkString
为每个相应元素调用toString
。看到它们已经是字符串开头,在这种特殊情况下,这可能是mkString
的一个负面因素。在性能,简洁/优雅等方面对这两种方法的优缺点有何评论?
答案 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
,因为它会溢出你的堆栈以获取大型集合(对于某些类型的集合)。 foldLeft
或fold
将起作用(不会在堆栈上存储中间数据),但会比mkString
更慢,更尴尬。如果列表非空,reduce
和reduceLeft
也可以。
答案 2 :(得分:3)
Im memory serve,mkString
使用StringBuilder来构建高效的String。你可以使用Scala StringBuilder
作为foldRight
的累加器来完成相同的事情,但是如果mkString
已经为你做了所有好事,为什么还要烦恼呢。加mkString
为您提供额外的好处,包括可选的分隔符。您可以在foldRight
中执行此操作,但已使用mkString