Función take En Kotlin

En este tutorial aprenderás a obtener los primeros n elementos de una colección con la función take en Kotlin. También verás el uso de sus variaciones takeLast(), takeWhile() y takeLastWhile().

Función take()

La función de extensión take() retorna en una lista conformada con el grupo desde el primer elemento hasta el enésimo elemento de una colección. Esto quiere decir que pasas como parámetro un entero (n) con la cantidad a retornar.

// take() en arreglos 
fun <T> Array<out T>.take(n: Int): List<T>

// take() en listas
fun <T> Iterable<T>.take(n: Int): List<T>

// take() en strings
fun String.take(n: Int): String

Si n es menor a 0, entonces se lanza una excepción IllegalArgumentException. Y si n es mayor al tamaño de la colección, entonces se retornan todos los elementos. Veamos algunos ejemplos:

fun main() {
    val numbers = intArrayOf(1, 5, 1, 4, 6, 9)
    println(numbers.take(3))

    val animals = listOf("Perro", "Elefante", "Piraña", "Mosca", "Raya")
    println(animals.take(1))

    val text = "Programación orientada a objetos"
    println(text.take(12))

    println(numbers.take(0))
    println(numbers.take(10)) // n > numbers.size
    println(numbers.take(-2)) // n < 0
}

Salida:

[1, 5, 1]
[Perro]
Programación
[]
[1, 5, 1, 4, 6, 9]
Exception in thread "main" java.lang.IllegalArgumentException: Requested element count -2 is less than zero.

El ejemplo anterior obtiene los primero 3 elementos del arreglo de enteros numbers. Luego obtiene el primer elemento de la lista animals y los primeros 12 caracteres del String text.

Por otro lado, el valor irregular de 0 retorna una lista vacía. Cuando n es mayor al tamaño de la colección se obtiene una lista con todos los elementos de la misma. Y si n es negativo entonces verás la excepción de la salida avisándolo.

Función takeLast()

Si deseas obtener los últimos n elementos de una colección, en vez de los primeros, en tal caso usa takeLast().

Por ejemplo, supón que tienes una lista con los días lluviosos de cada mes del año en la ciudad de Cali (Colombia). Usa takeLast() para obtener el promedio de los meses de octubre, noviembre y diciembre.

fun main() {

    val rainyDaysPerMonth = intArrayOf(
        19, 17, 18, 17, 15, 11,
        11, 11, 15, 19, 20, 19
    )
    val last3MonthsAvg = rainyDaysPerMonth.takeLast(3).average()
    println("Promedio: %.2f".format(last3MonthsAvg))
}

Salida:

Promedio: 19,33

La solución consiste en obtener los tres últimos meses del año con takeLast(3) y luego aplicar la función average() para obtener el promedio.

Función takeWhile()

Usa a la función takeWhile() cuando necesites obtener el grupo desde el elemento inicial, hasta el primer elemento que no cumpla con un predicado. Es decir, mientras se cumpla la condición, los elementos se irán agregando al resultado final.

Por ejemplo, obtener el primer renglón de un párrafo expresado en una lista de Strings.

fun main() {
    val paragraph = listOf("Este", "es", "un", "renglón.", "\n", "Y", "este", "es", "otro")
    val firstLine = paragraph.takeWhile { it != "\n" }.joinToString(" ")
    println(firstLine)
}

Salida:

Este es un renglón.

Como ves, el párrafo está dividido en palabras y a su vez los renglones se dividen por el carácter especial "\n" (salto de línea).

Por lo que si usamos la expresión de desigualdad { it != "\n" } en el predicado de takeWhile(), obtendremos todas las palabras del primer renglón.

Función takeLastWhile()

Al igual que takeWhile(), la función takeLastWhile() toma una función lambda con el predicado a satisfacer por los elementos que se quieren incluir en el resultado final. La diferencia es que se comienza el recorrido de evaluaciones desde el último elemento de la colección.

Usemos como ilustración la obtención de la suma de los últimos elementos positivos de un arreglo de números.

fun main() {
    val numbers = intArrayOf(-2, 1, 54, 1, 78, 31, -2, 3, 4, 0)
    val sumOfLastPositives = numbers.takeLastWhile { it >= 0 }.sum()
    println("Suma: $sumOfLastPositives")
}

Salida:

Suma: 7

La solución consiste en usar la función takeLastWhile() con una función lambda que exprese que el número debe ser mayor o igual a cero. Esto tomará los elementos 3, 4 y 0. Y aplicamos la función sum() para obtener la sumatoria que será 7.

Ú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!