La Función count En Kotlin

ANUNCIO
Loading...

En este tutorial veras el uso de la función count En Kotlin para saber cuántos elementos de una colección satisface un predicado.

Sintaxis De La Función count()

La función count hace parte del grupo de funciones de agregación, las cuales calculan un solo valor de retorno basado en una colección de elementos.

Su objetivo es entregarte el número de elementos que cumplen con la condición que establezcas.

Ejemplo de la función count en Kotlin

La ilustración anterior muestra una colección de cuatro elementos enteros. Luego de aplicarle un predicado para los números menores a cero a través de count, el resultado será dos como es evidente. Lo anterior puede ser expresado en Kotlin con la función lambda {it < 0}:

fun main() {
    val numbers = listOf(-2, -1, 0, 1)
    println(numbers.count { it < 0 }) // 2
}

La siguiente es la sintaxis de la función count en Kotlin para diferentes tipos de colecciones:

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

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

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

Adicionalmente, la función count() también puede ser usada sin predicado para obtener el número de ítems de la colección:

fun main() {
    val array = arrayOf("tutoriales", "de", "kotlin")
    println(array.count()) // 3
}

Ejemplo De count En Lista

Tomemos como referencia de diseño una clase de datos que representa animales. Esta proyecta su nombre y clasificación (vertebrado o invertebrado).

data class Animal(val name: String, val classification: Classification) {
    enum class Classification {
        VERTEBRATE, INVERTEBRATE
    }
}

Ahora supongamos que deseamos filtrar una lista de animales dada, aplicando la condición de solo aquellos que comiencen por la letra ‘C’. Y luego sobre esos elementos contar solo los que son vertebrados:

import Animal.Classification.*

data class Animal(val name: String, val classification: Classification) {
    enum class Classification {
        VERTEBRATE, INVERTEBRATE
    }
}

fun main() {
    val animals = listOf(
        Animal("Zorro", VERTEBRATE),
        Animal("Conejo", VERTEBRATE),
        Animal("Cangrejo", INVERTEBRATE),
        Animal("Tortuga", VERTEBRATE),
        Animal("Caracol", INVERTEBRATE),
        Animal("León", VERTEBRATE),
        Animal("Medusa", INVERTEBRATE)
    )
    val startsWithC = { animal: Animal -> animal.name.startsWith('C') }
    val isInvertabrate = { animal: Animal -> animal.classification == INVERTEBRATE }

    val animalsWithC = animals.filter(startsWithC)
    println(animalsWithC.map{it.name}) // ["Conejo", "Cangrejo", "Caracol"]
    println(animalsWithC.count(isInvertabrate)) // 2
}

La solución anterior construye los predicados en dos variables con lambdas que representen el empezar con C (startsWithC) y el hecho de que sea invertebrado (isInvertebrate).

Luego aplica a la lista animals la función filter para obtener los elementos con los nombres de «Conejo», «Cangrejo» y «Caracol». Para solo visualizar el nombre en la impresión usamos la función map.

Sobre ese resultado invocamos a count para determinar cuántos son vertebrados. En este caso el resultado serán dos: cangrejo y caracol.

Ejemplo De count Con Mapa

Considera un mapa con pares de meses del año y número de accidentes de tráfico. Se necesita encontrar el número de meses donde los accidentes fueron mayores a 30 sin tener en cuenta a Enero.

import kotlin.collections.Map.Entry

fun main() {
    val accidentsPerMonth = mapOf(
        "Enero" to 32,
        "Febrero" to 15,
        "Marzo" to 56,
        "Abril" to 74,
        "Mayo" to 35,
        "Junio" to 26,
        "Julio" to 42
    )

    val isCounted = { it: Entry<String, Int> ->
        it.key != "Enero" && it.value > 30
    }
    println(accidentsPerMonth.count(isCounted)) // 4
}

El ejemplo anterior muestra el aislamiento de las condiciones enunciadas en la variable isCounted. Ya que el parámetro de la función lambda es de tipo Map.Entry, puedes acceder a las propiedades key y value para aplicar el predicado.

El resultado final serán 4, ya que la entrada del mes de enero no cuenta y tanto Febrero como Junio reportaron cifras de accidentes menores a 30.

¿Ha sido útil esta publicación?