Icono del sitio Develou

La Función filter En Kotlin

En este tutorial aprenderás a filtrar colecciones a través de la función filter en Kotlin. Verás como pasar predicados para seleccionar solo aquellos elementos que sean de tu interés.

Función filter()

La función de extensión filter te permite filtrar los ítems de una colección de elementos a partir de un predicado como argumento.

El predicado afirma o niega expresiones sobre el sujeto (cada elemento de la colección). Si un elemento satisface al predicado, entonces es incluido en el resultado final.

Este parámetro es representado por un tipo función cuyo único argumento es el sujeto y el cuerpo es Boolean. En la ilustración anterior veías que si se aplica el predicado x > 0 sobre la lista L = {-2 ,-1 ,0, 1} el resultado solo será el elemento 1.

Filtrar Listas

La definición para filter{ } a la hora de tratar elementos iterables, como las listas o sets, es la siguiente:

inline fun <T> Iterable<T>.filter(
    predicate: (T) -> Boolean
): List<T>

Considera una lista de número enteros de la cual deseas obtener aquellos elementos que sean múltiplos de cinco. Usa la función filter y pasa una lambda que exprese este predicado:

fun main() {
    val numbers = listOf(1, 3, 5, 8, 10, 11, 15, 31, 40)
    val multiplesOfFive = numbers.filter { x -> x % 5 == 0 }
    println(multiplesOfFive) // [5, 10, 15, 40]
}

El ejemplo anterior usa la condición x % 5 == 0 para determinar si el sujeto es múltiplo de 5. Efectivamente la salida será una lista List<Int> con 5, 10, 15 y 40, que son los que satisfacen esta descripción.

Por otro lado, recuerda que siempre puedes usar la referencia it si no tienes problema con la legibilidad en el contexto de la función lambda:

numbers.filter { it % 5 == 0 }

Filtrar Mapas

Al filtrar un mapa con filter{ } el resultado será otro mapa con las entradas que cumplan las condiciones del predicado.

inline fun <K, V> Map<out K, V>.filter(
    predicate: (Entry<K, V>) -> Boolean
): Map<K, V>

Por ejemplo, supongamos que tenemos en un mapa pares con el nombre y edad de proveedores. Se requiere crear un reporte con aquellos nombres que comiencen por la letra S y su edad sea mayor a 30.

fun main() {
    val providers = mapOf(
        "Sergio" to 29,
        "Alberto" to 35,
        "Ximena" to 24,
        "Griselda" to 31,
        "Sara" to 65,
        "Poly" to 45
    )
    val result = providers.filter { (name, age) ->
        name.startsWith('S') && age > 30
    }
    println(result) // {Sara=65}
}

El predicado anterior usa dos proposiciones, la verificación de si la clave comienza con el carácter 'S' a través de la función startsWith() y la desigualdad age > 30.

La única entrada que hará parte luego de ejecutar el código será el par {Sara=65}.

Salir de la versión móvil