Función contains En Kotlin

En este tutorial verás el uso de la función contains en Kotlin con el propósito de determinar si un elemento existe en una colección. También verás a containsAll() para verificar si existen una colección dentro de otra.

Función contains()

La función de extensión contains() retorna true si el elemento pasado como parámetro se encuentra en la colección invocadora. O en el caso de los mapas, si la clave existe.

// Sintaxis de contains() en arreglos
operator fun <T> Array<out T>.contains(element: T): Boolean

// Sintaxis de contains() en iterables
operator fun <T> Iterable<T>.contains(element: T): Boolean

// Sintaxis de contains() en mapas
operator fun <K, V> Map<out K, V>.contains(key: K): Boolean

La sintaxis de esta función usa el modificador operator para proveerte la construcción alternativa con el operador in, el cual se puede incluir en una expresión con dos operandos, para preguntar por la existencia del elemento izquierdo en la colección derecha (elemento in coleccion).

Los siguientes son algunos ejemplos del uso de la función contains():

fun main() {
    // (1)
    val seaLevels = intArrayOf(7492, 2764, 2942, 395, 63, 2745)
    val isSixtyThreeContained = seaLevels.contains(63)
    println("¿Existe el elemento 63?: $isSixtyThreeContained")

    // (2)
    val subjects = listOf("Matemáticas", "Inglés", "Sociales", "Biología", "Química")
    val isReligionContained = "Religión" in subjects
    println("¿Existe el elemento \"Religión\"?: $isReligionContained")

    // (3)
    val elementsAndSymbols: Map<String, String>? = mutableMapOf(
        "Hidrógeno" to "H", "Helio" to "He", "Litio" to "Li",
        "Berilio" to "Be", "Oxígeno" to "O"
    )
    val isLitioContained = elementsAndSymbols?.contains("Litio") == true
    println("¿Existe la clave \"Litio\"?: $isLitioContained")
}

Salida:

¿Existe el elemento 63?: true
¿Existe el elemento "Religión"?: false
¿Existe la clave "Litio"?: true

En los tres ejemplos anteriores verás los siguientes casos:

  1. Se determina si existe el valor 63 en un arreglo con niveles del mar de varios países a través de contains(63).
  2. Aquí preguntamos si se encuentra Religión en una lista de materias a través del operador in.
  3. Determinamos si el elemento químico Litio hace parte de un mapa anulable. Para este caso se usa el operador de acceso seguro (?) antes de contains(), con el fin de evitar errores de nulos. Luego igualamos con true para que el resultado no sea Boolean?.

Función containsAll()

Usa a la función containsAll() para verificar si todos los elementos de una colección se encuentran en otra. Pasa como parámetro una instancia de tipo Collection<T> y espera un resultado Boolean como salida:

fun <T> Collection<T>.containsAll(
    elements: Collection<T>
): Boolean

Por ejemplo, supón que tenemos una clase de datos que representa a los materiales de una receta llamada Material. Sus propiedades son el nombre y cantidad necesaria del material:

data class Material(val name: String, val quantity: Int)

Ahora se presenta una situación donde existe una receta compuesta por varios materiales y deseamos saber si un usuario dispone de algunos elementos de la misma. El código Kotlin que simula este comportamiento se vería así:

fun main() {
    val recipe = listOf(
        Material("Banano", 2),
        Material("Avena", 125),
        Material("Huevo", 1),
        Material("Canela", 1),
        Material("Polvo para hornear", 25)
    )

    val search = listOf(Material("Banano", 1), Material("Canela", 1))
    val materialsInRecipe = recipe.containsAll(search)
    println("recipe.containsAll(search) es $materialsInRecipe")
}

Salida:

recipe.containsAll(search) es false

Como ves, la lista recipe contiene a cinco elementos necesarios para realizar la receta. Luego se crea otra lista llamada search con dos materiales que deseamos verificar si existen dentro de recipe.

Aunque su nombre si existe, las unidades de bananos no son iguales a los de la receta (1!=2), es por eso que el resultado nos indica que no se encuentran los elementos (false).

Tanto contains() como containtsAll() usan el método equals() de los elementos para comparar la existencia. Recuerda que usando al modificador data en Material se genera automáticamente este método. De lo contrario, sobrescríbelo junto a hashCode().

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