Icono del sitio Develou

Función drop En Kotlin

En este tutorial verás el uso de la función drop en Kotlin para retornar una lista con todos los elementos excepto los primeros n elementos. También verás sus variaciones para obtener los últimos n elementos (takeLast()) y para aplicar predicados la obtención (takeWhile() y takeLastWhile()).

Función drop()

Usa la función de extensión drop() para obtener una lista con todos los elementos de una colección, excepto los n primeros elementos.

Este comportamiento es el contrario al de la función take(). Es decir, en vez de proponer la toma elementos, deseamos expulsaros explícitamente del resultado final.

// Sintaxis de drop() en arreglos genéricos
fun <T> Array<out T>.drop(n: Int): List<T>

// Sintaxis de drop() en iterables
fun <T> Iterable<T>.drop(n: Int): List<T>

Si el argumento pasado a n es menor a cero, entonces se lanzará una excepción IllegalArgumentException. Si es cero, entonces obtendrás todos los elementos de la colección.

Por ejemplo, considera el rango de números enteros del 1 hasta el 10. Si quisiéramos tomar todos los números excepto los primeros 5, entonces usamos drop(5):

fun main() {
    val oneToTen = 1..10
    val numbersAfterDrop5 = oneToTen.drop(5)
    println("Al soltar 5 elementos: $numbersAfterDrop5")

    val numbersAfterDrop0 = oneToTen.drop(0)
    println("Al soltar 0 elementos: $numbersAfterDrop0")

    val numbersAfterDropMinus2 = oneToTen.drop(-2)
    println(numbersAfterDropMinus2)
}

Salida:

Al soltar 5 elementos: [6, 7, 8, 9, 10]
Al soltar 0 elementos: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Exception in thread "main" java.lang.IllegalArgumentException: Requested element count -2 is less than zero.

El primer caso propuesto para soltar los primeros 5 elementos nos dejará la lista del 6 al 10 como números restantes.

Pasar 0 indica que no deseamos soltar a ningún elemento, por lo que obtendremos todos los valores de nuevo.

Y usar un argumento negativo, como el literal entero negativo -2, lanzará una excepción con el mensaje "Requested element count -2 is less than zero".

Función dropLast()

Si deseas excluir una cantidad de elementos pero desde el final de la colección, entonces usa dropLast(). Al igual que drop(), esta función recibe como parámetro a n.

Por ejemplo, supongamos que tenemos un mapa con 10 pares de nombres y cantidad de goles anotados de jugadores de fútbol. Y se requiere ordenarlos descendentemente por cantidad de goles, descartar los últimos 7 y luego imprimir el resultado.

fun main() {

    val playersAndGoals = mapOf(
        "Gerd Muller" to 681,
        "Jimmy Jones" to 647,
        "Cristiano Ronaldo" to 770,
        "Eusébio" to 545,
        "Pelé" to 767,
        "Jose Bican" to 805,
        "Lionel Messi" to 734,
        "Ferenc Puskás" to 706,
        "Romário" to 743,
        "Zlatan Ibrahimovic" to 564
    )

    val highestScorers = playersAndGoals
        .toList()
        .sortedByDescending { it.second }
        .dropLast(7)
    highestScorers.forEachIndexed { index, pair -> println("${index + 1}. $pair") }
}

Salida:

1. (Jose Bican, 805)
2. (Cristiano Ronaldo, 770)
3. (Pelé, 767)

La solución plasmada consistió en convertir el mapa a una lista primero, luego se encadenó un ordenamiento descendente con sortedByDescending() y expulsamos los últimos 7 elementos con dropLast(). Al final imprimimos cada jugador con su posición a través de forEachIndexed().

Como ves, dependiendo del contexto y legibilidad, dropLast(7) pudo haber sido expresado como take(3) para obtener solo los primeros 3 jugadores.

Función dropWhile()

Usa dropWhile() cuando requieras el efecto de drop(), pero usando como parámetro de expulsión a una función lambda de predicado. El resultado serán todos los elementos, excepto los primeros elementos que satisfagan el predicado.

Por ejemplo, a partir de un String, expulsar todos los caracteres de izquierda a derecha mientras el carácter evaluado no sea un dígito.

fun main() {
    val text = "Llega a Francia en 1910. Acto seguido"
    val afterFirstDigit = text.dropWhile { !it.isDigit() }
    println(afterFirstDigit)
}

Salida:

1910. Acto seguido

La solución pasa a dropWhile() como predicado la expresión «no es un dígito», esto significa que se irán soltando elementos mientras esta condición sea verdadera. Al momento en que se encuentra con '1', se torna falsa, por lo que desde ese lugar obtiene los caracteres hacia el final.

Función dropLastWhile()

La función dropLastWhile() es la versión de dropLast() pero con un predicado como parámetro. Esta retorna en una lista con todos los elementos, excepto los últimos elementos que satisfagan el predicado.

Tomemos como ilustración a una lista de números enteros, de la cual deseamos encontrar los números anteriores a la primera aparición de un cero.

fun main() {
    val numbers = listOf(1, -2, 0, 36, -45, 1, 10, 115, -23, 4)
    val beforeZero = numbers.dropLastWhile { it != 0 }
    println(beforeZero)
}

Salida:

[1, -2, 0]

Al usar la función dropLastWhile() con el predicado { it != 0 }, se recorre la lista iniciando desde el último elemento y preguntando en cada iteración si el elemento es diferente de 0. Cada elemento que cumpla la condición será expulsado del resultado final.

Salir de la versión móvil