La Función any En Kotlin

En este tutorial verás el uso de la función any en Kotlin para determinar si al menos un elemento en una colección coincide con el predicado que especifiques.

Función any()

La función any hace parte del grupo de funciones que reciben un predicado para determinar si los elementos cumplen condiciones.

Su propósito es retornar un resultado booleano que expresa: «Al menos uno de los elementos de la colección ha satisfecho el predicado». Tendrás true en caso positivo, de lo contrario false.

// Arreglos
inline fun <T> Array<out T>.any(
    predicate: (T) -> Boolean
): Boolean

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

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

Como viste con filter, el predicado es un tipo función con un parámetro con el tipo de elementos de la colección y el cuerpo es la expresión booleana aplicada. Esto te permite pasar literales de función como lambdas y funciones anónimas.

Aplicar any En Listas

Tomemos como ilustración una lista de enteros para explicar el uso de predicados de la función any en Kotlin:

fun main() {
    val numbersList = listOf(-3, 4, 0, 5, 3)

    // ¿Hay números negativos?
    println(numbersList.any { it < 0 }) // true

    // ¿Hay números impares?
    println(numbersList.any { it % 2 != 0 }) // true

    // ¿Hay mayores a 10?
    println(numbersList.any { it > 10 }) // false

    // ¿Hay elementos?
    println(emptyList<Int>().any()) // false
}

El ejemplo anterior muestra el uso de cuatro predicados. Los tres primeros permiten determinar si en numbersList existen negativos, números impares y números mayores a 10.

La comprobación final, al crear una lista vacía con emptyList(), invoca a la función any() sin predicado. Esta comprueba si existe al menos un elemento en la colección, por lo que tendrás false como resultado.

Aplicar any En Mapas

Veamos otro ejemplo donde tenemos un mapa con varios ítems de un inventario. Necesitamos determinar si hay elementos que están agotándose (unidades menores a 10) y si el nombre contiene el String "ch":

fun main() {    

    val items = mapOf(
        "Pastel" to 1,
        "Pan tajado" to 100,
        "Leche" to 9,
        "Salchicas" to 15
    )
    println(items.any {
        val isItOutOfStock = it.value < 10
        val containsCH = "ch" in it.key

        isItOutOfStock && containsCH
    }) // true
}

El predicado está construido por dos proposiciones que podemos separar en variables dentro del lambda pasado en any{ }. Si la entrada tiene menos de 10 unidades (isItOutOfStock) y su clave contiene a «ch» (containsCH) entonces tendrás true como resultado.

La función devolverá resultado positivo ya que el par Leche=9 cumple satisface el predicado completamente. Recuerda que tu lambda usa como parámetro un tipo Entry<K, V> por lo que puedes acceder a key y value regularmente.

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