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:
- Se determina si existe el valor 63 en un arreglo con niveles del mar de varios países a través de
contains(63)
. - Aquí preguntamos si se encuentra
Religión
en una lista de materias a través del operadorin
. - Determinamos si el elemento químico Litio hace parte de un mapa anulable. Para este caso se usa el operador de acceso seguro (
?
) antes decontains()
, con el fin de evitar errores de nulos. Luego igualamos contrue
para que el resultado no seaBoolean?
.
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 Materia
l se genera automáticamente este método. De lo contrario, sobrescríbelo junto a hashCode()
.