En este tutorial aprenderás sobre la aplicación de la función joinToString
en Kotlin con el propósito de crear un String legible a partir de los elementos de una colección.
Función joinToString()
La función de extensión joinToString()
es una utilidad que transforma una colección de elementos en un String
. Puedes personalizar al construcción a partir de parámetros que especifican el separador, prefijo, sufijo, límite o transformación.
// Ejemplo de sintaxis de joinToString() para iterables
fun <T> Iterable<T>.joinToString(
separator: CharSequence = ", ",
prefix: CharSequence = "",
postfix: CharSequence = "",
limit: Int = -1,
truncated: CharSequence = "...",
transform: ((T) -> CharSequence)? = null
): String
Veamos el objetivo de cada parámetro nombrado:
separator
: Es el conjunto de caracteres que se anexa como separador entre la conversión a string de cada elemento. El valor por defecto es una coma junto a un espacio en blanco (ej:"1, 2, 3"
)prefix
: Es el string que se usa como inicio del resultado final. El valor por defecto es un espacio en blanco.postfix
: Cadena que se anexa al final del resultadolimit
: Determina una cantidad positiva de elementos que serán incluidos en la transformación. Su valor por defecto es -1, indicando que deben ser incluidos todos.truncated
: String que se agrega cuando se usa alimit
para truncar el resultadotransform
: Función lambda que transforma cada elemento de la colección y usarlo como parte del string final
A continuación verás varios ejemplos de joinToString()
para comprender diferentes configuraciones al variar sus argumentos.
Aplicar Separador, Prefijo Y Sufijo A joinToString()
Tomemos como ejemplo la necesidad de imprimir una representación de la serie infinita, la cual se expresa como una sumatoria de n términos de la forma 1 + 2 + 3 ···
.
Al aplicar joinToString()
podremos llegar a la siguiente solución:
fun main() {
val terms = 1..10
val serieRepresentation = terms.joinToString(
separator = " + ",
prefix = "S = ",
postfix = " + ···"
)
println(serieRepresentation)
}
Salida:
S = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + ···
La configuración para obtener el string con forma de expresión de serie requiere el uso de un separador con un símbolo de adición y espacios en sus laterales.
El prefijo será la notación de serie con la letra mayúscula S
y operador de asignación (=
). Por el lado del sufijo tenemos el término final designado con tres operadores de viñeta (·
).
Aplicar Límite Y Truncado En joinToString()
Ahora modifiquemos el uso de joinToString()
en el caso anterior para limitar los términos a solo 5.
fun main() {
val terms = 1..10
val serieRepresentation = terms.joinToString(
separator = " + ",
prefix = "S = ",
limit = 5,
truncated = "···"
)
println(serieRepresentation)
}
Salida:
S = 1 + 2 + 3 + 4 + 5 + ···
En este caso pasamos 5
como argumento para limit
y a truncated
los tres puntos viñeta que representan el infinito al truncar los elementos incluidos.
Aplicar Transformación A joinToString()
Probemos el uso del parámetro de transformación para conseguir la expresión de la serie anterior, pero acompañando a cada término de la letra a y finalizando con an. Por ejemplo: a1 + a2 + ··· + an
.
fun main() {
val terms = 1..10
val serieRepresentation = terms.joinToString(
separator = " + ",
prefix = "S = ",
limit = 5,
postfix = " + an",
truncated = "···"
) { "a$it" }
println(serieRepresentation)
}
Salida:
S = a1 + a2 + a3 + a4 + a5 + ··· + an
La función de transformación es sencilla, pasamos una lambda con una plantilla de string, donde concatenamos el carácter a junto al elemento actual a través de la referencia it
. Esta nos da los términos consecutivos.
Para encontrar el espaciado entre el penúltimo término y an, agregamos a postfix
para que haga parte del cierre del String.