La Función all En Kotlin

En este tutorial aprenderás acerca del uso de la función all en Kotlin para determinar si todos los elementos de una colección satisfacen un predicado.

La Función all()

Usa la función all{} en Kotlin con el fin de averiguar si todos los elementos de una colección cumplen la condición expresada en un predicado.

La sintaxis para aplicarla es la siguiente:

// Arrays
inline fun <T> Array<out T>.all(
    predicate: (T) -> Boolean
): Boolean

// Iterables
inline fun <T> Iterable<T>.all(
    predicate: (T) -> Boolean
): Boolean

// Mapas
inline fun <K, V> Map<out K, V>.all(
    predicate: (Entry<K, V>) -> Boolean
): Boolean

Al igual que any{}, la función all recibe un tipo función como parámetro (predicate), lo que posibilita pasar una lambda con la condición a cumplir por los elementos.

Cuando se invoca a all desde una colección vacía, sea cual sea el predicado que pases, el resultado será true por el principio de la verdad vacua.

fun main() {
    // verdad vacua
    println(emptyList<Int>().all { it == 0 }) // true
}

Ejemplo De all Con Lista

Considera una lista de Strings con nombres de animales para la cual deseamos saber si todas cumplen la restricción de tener tres o más caracteres:

fun main() {
    val animalNames = listOf("Búho", "León", "Zebra", "Perro", "Boa", "Ñu")
    println(animalNames.all { name -> name.length >= 3 }) // false
    println(animalNames.all { it.length >= 3 }) // false
}

En el ejemplo anterior el resultado es false. No todos cumplen al verificar la igualdad de la propiedad length con tres ("Ñu").

Recuerda que si el contexto es lo suficiente legible y claro, puedes usar la referencia it para acortar al predicado como en la línea 3.

Ejemplo De all Con Rango

Supongamos que deseamos crear una función de extensión para los rangos enteros donde se determine si todos los elementos son positivos.

Existen diferentes formas de llegar a este resultado, pero ya que estamos hablando de la función all{ } creemos una con ella:

fun IntRange.allPositives(): Boolean {
    return all { numberInRange -> numberInRange > 0 }
}

fun main() {
    println((1..10).allPositives()) // true
    println((-1..2).allPositives()) // false
    println((-3..-1).allPositives()) // false

}

La función allPositives() llama a all usando como tipo recibidor a IntRange. De esta forma es posible llamar desde cualquier rango entero al método.

Ejemplo De all Con Mapa

Tomemos como ilustración un mapa que representa una mano con cartas del jugador. El objetivo es determinar si solo hay cartas impares en la mano:

import kotlin.collections.Map.Entry

fun main() {
    val hand = mapOf(
        "Matar" to 3,
        "Rastreo" to 1,
        "Disparo mortal" to 3,
        "Compañero animal" to 3
    )

    val isOdd = { card: Entry<String, Int> -> card.value % 2 == 0 }

    println("¿Hay solo costes impares en la mano?: ${hand.all(isOdd)}")
}

Salida:

¿Hay solo costes impares en la mano?: true

Evidentemente las entradas de inicio solo son costos uno y tres, por lo que la función all retornará en true, al pasar la lambda almacenada en isOdd.

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