pos*_*def 10 functional-programming scala string-concatenation
我目前在Scala中尝试一些东西,试图习惯于函数式编程以及再次使用一种新语言(自上次以来已经有一段时间了).
现在给出一个字符串列表,如果我想将它们合并成一个长字符串(例如"scala", "is", "fun" => "scalaisfun"),我想通过一种方法来做它foldRight并在各个元素上应用连接.另一种方式,无论如何更简单,就是打电话mkString.
我检查了github,但无法真正找到相应功能的源代码(对此有任何帮助将不胜感激),所以我不确定这些功能是如何实现的.从我的头脑中,我认为mkString它更灵活,但感觉foldRight在某个地方可能有一个实现.这有什么道理吗?
否则scaladocs会提到为每个元素mkString调用toString.看到他们已经开始使用,mkString在这种特殊情况下,这可能是一个负面因素.在性能,简洁/优雅等方面对这两种方法的优缺点有何评论?
sen*_*nia 20
简单回答:使用mkString.
someString.toString 返回相同的对象.
mkString使用单个实现,StringBuilder它只创建一个新字符串.随着foldLeft你将创建N-1新的字符串.
你可以使用StringBuilderin foldLeft,它会尽可能快mkString,但mkString更短:
strings.foldLeft(new StringBuilder){ (sb, s) => sb append s }.toString
strings.mkString // same result, at least the same speed
Run Code Online (Sandbox Code Playgroud)
foldRight除非你确实需要它,否则不要使用它,因为它会溢出你的堆栈以用于大型集合(对于某些类型的集合). foldLeft或fold将工作(不会在堆栈上存储中间数据),但会比较慢,更尴尬mkString.如果列表不为空,reduce并且reduceLeft也可以工作.