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
.