La Función find En Kotlin

En este tutorial te mostraremos como usar la función find en Kotlin para encontrar el primer elemento de una colección que cumpla con el predicado establecido.

La Función find()

Las diferentes formas de la función find toman como parámetro un predicado de tipo función, el cual representa la condición que debe cumplir el elemento que deseas encontrar.

Si no se encuentra una coincidencia, el valor retornado es null. Si existe más de una coincidencia, entonces el resultado será la primera encontrada. La siguiente es la sintaxis de sus formas:

// Arrays
inline fun <T> Array<out T>.find(
    predicate: (T) -> Boolean
): T?

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

Ejemplo De find Con Lista

Tomemos como ilustración una lista de enteros de la cual se desea conocer:

  • El primer elemento que sea negativo
  • El primer elemento que sea positivo
  • El primer número impar
  • El primero que pertenezca al subconjunto [5,10]
  • El primer elemento que sea mayor a cien:
fun main() {
    val numbers = listOf(2, 3, 1, 0, -1, 4, -7, 10)

    println(numbers.find { it < 0 })        // -1
    println(numbers.find { it > 0 })        // 2
    println(numbers.find { it % 2 != 0 })   // 3
    println(numbers.find { it in 5..10 })   // 10
    println(numbers.find{ it > 100})        // null
    println(numbers.find { true })          // 2
    println(numbers.find { false })         // null
}

Como ves, cuando el predicado es satisfecho la primera vez se retorna al elemento. Si el elemento no existe como en la línea del predicado { it > 100 }, obtendrás null.

Ejemplo De find Con String

La clase CharSecuence también tiene creada una función de extensión find para encontrar el carácter que cumpla con las proposiciones del predicado proveído.

Considera una cadena de texto en la cual deseamos encontrar al primer carácter que no sea un espacio en blanco.

fun main() {
    val string = "   Kotlin"
    val isCharacter = { c: Char -> !c.isWhitespace() }
    println(string.find(isCharacter)) // K
}

La solución consiste en usar la función Char.isWhitespace, la cual determina si es el carácter espacio en blanco. Luego se crea una función lambda almacenada en isCharacter. La idea es negar el resultado del isWhitespace() y luego pasarlo a find{ }.

Evidentemente el resultado es el carácter 'K' al ser el primer elemento diferente de un espacio en blanco.

¿Ha sido útil esta publicación?