example scala functional-programming string-concatenation

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