Función joinToString En Kotlin

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 resultado
  • limit: 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 a limit para truncar el resultado
  • transform: 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.

Únete Al Discord De Develou

Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!