Función drop En Kotlin

ANUNCIO
Loading...

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>
Lenguaje del código: Kotlin (kotlin)

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) }
Lenguaje del código: Kotlin (kotlin)

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.
Lenguaje del código: CSS (css)

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") } }
Lenguaje del código: Kotlin (kotlin)

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) }
Lenguaje del código: Kotlin (kotlin)

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) }
Lenguaje del código: Kotlin (kotlin)

Salida:

[1, -2, 0]
Lenguaje del código: JSON / JSON con comentarios (json)

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.

¿Ha sido útil esta publicación?

ANUNCIO
Loading...