scala - example - Fusionando una lista de cadenas usando mkString vs foldRight
foldleft scala (3)
Actualmente estoy probando cosas en Scala, tratando de acostumbrarme a la programación funcional, así como de volver a utilizar un nuevo lenguaje (ha pasado un tiempo desde la última vez).
Ahora, dada una lista de cadenas si quiero fusionarlas en una cadena larga (por ejemplo, "scala", "is", "fun" => "scalaisfun"
), pensé que una forma de hacerlo sería hacer un foldRight
y aplicar concatenación en los elementos respectivos. Otra forma, ciertamente mucho más simple, es llamar a mkString
.
Comprobé en github pero no pude encontrar el código fuente para las funciones respectivas (se agradecería cualquier ayuda), así que no estoy seguro de cómo se implementan las funciones. Desde lo más alto de mi cabeza, creo que mkString
es más flexible, pero se siente que podría haber un foldRight
en la implementación en alguna parte. ¿Hay algo de verdad en ello?
De lo contrario, los scaladocs mencionan que mkString
llama a toString
para cada elemento respectivo. Al ver que ya son cadenas para empezar, ese podría ser un punto negativo para mkString
en este caso particular. ¿Algún comentario sobre los pros y contras de ambos métodos, con respecto al rendimiento, simplicidad / elegancia, etc.?
La memoria sirve, mkString
usa un StringBuilder para construir el String que es eficiente. Usted podría lograr lo mismo utilizando un Scala StringBuilder
como acumulador para foldRight
, pero ¿por qué molestarse si mkString
ya puede hacer todas esas cosas buenas para usted? Además, mkString
le brinda la ventaja adicional de incluir también un delimitador opcional. Podrías hacer eso en foldRight
pero ya está hecho para ti con mkString
No use foldRight
menos que realmente lo necesite, ya que desbordará su pila para colecciones grandes (para algunos tipos de colecciones). foldLeft
o fold
funcionará (no almacena datos intermedios en la pila), pero será más lento y más incómodo que mkString
. Si la lista no está vacía, reduce
y reduceLeft
también funcionará.
Respuesta simple: use mkString
.
someString.toString
devuelve el mismo objeto.
mkString
se implementa con un único StringBuilder
y solo crea 1 cadena nueva. Con foldLeft
creará N-1
nuevas cadenas.
Puede usar StringBuilder
en foldLeft
, será tan rápido como mkString
, pero mkString
es más corto:
strings.foldLeft(new StringBuilder){ (sb, s) => sb append s }.toString
strings.mkString // same result, at least the same speed