Contenido del curso

map, filter y find en colecciones Kotlin

Resumen

Las higher-order functions en Kotlin te permiten transformar, filtrar y buscar elementos dentro de colecciones usando lambdas como parámetros. Si trabajas con listas de objetos como correos electrónicos, dominar estas funciones te ahorra ciclos completos de iteración manual y hace tu código más expresivo.

En las siguientes secciones vas a ver cómo aplicar map, filter, first, last y find sobre una colección de emails, y cómo construir tu propia función de alto orden con callbacks para casos de éxito y error.

¿Qué es una lambda y por qué se llama función anónima?

Una lambda es una función que no tiene nombre. Por eso también se le conoce como función anónima. Puedes guardarla en una variable y pasarla como argumento, o pasarla directamente entre paréntesis al invocar otra función.

¿Qué es una lambda en Kotlin? Es una función anónima que puedes pasar como argumento a otra función. No necesita declaración previa ni nombre, y se usa para expresar comportamiento de forma corta.

En el ejemplo de la clase [00:35], la misma lambda que formatea correos se invoca de dos maneras: guardándola en una variable o pasándola en línea. El resultado por consola es idéntico.

¿Cómo usar map y filter sobre una colección?

La función map transforma cada elemento de la colección y devuelve una nueva lista con los valores modificados. La función filter recorre cada elemento y conserva solo los que cumplen una condición booleana [01:30].

En el ejemplo, sobre una lista de emails se aplica un filtro para conservar solo aquellos cuyo sender empiece por la letra A:

  • Accedes al primer carácter del string con .first().
  • Comparas ese carácter usando comillas simples, porque un char no se compara con un string.
  • El resultado es otra lista, en este caso emailsFormateados, que solo contiene al admin.

Esta diferencia entre comillas simples y dobles es uno de los detalles que más confunden al inicio. Un carácter individual va entre comillas simples; una cadena de texto, entre comillas dobles.

¿Cuándo usar first, last y find en Kotlin?

A diferencia de filter, que devuelve una lista, las funciones first, last y find devuelven un único elemento. Sirven cuando solo te interesa una coincidencia puntual.

  • first devuelve el primer elemento que cumple la condición.
  • last devuelve el último elemento que cumple la condición.
  • find devuelve el primer elemento que cumple la condición o null si no encuentra ninguno.

En el ejemplo [03:20], al pedir el primer email cuyo subject empiece por la letra A, la consola lanza una excepción porque ningún correo cumple esa condición. Cambiando la condición a la letra R, aparece el correo de "reunión". Si en lugar de first usas last, la consola devuelve el de "reporte".

¿Qué pasa si first no encuentra ningún elemento? Lanza una excepción. Por eso, si no estás seguro de que exista al menos una coincidencia, conviene usar find, que devuelve null en lugar de fallar.

Un detalle práctico al comparar texto: convertir el subject a lowercase antes de comparar evita errores por diferencias entre mayúsculas y minúsculas.

¿Cómo crear tu propia higher-order function con callbacks?

El ejercicio de la clase [05:40] propone construir una función llamada buscarEmail que reciba cuatro parámetros:

  1. Una lista de emails.
  2. Una lambda que reciba un email y devuelva un boolean con la condición de búsqueda.
  3. Un callback onFound que reciba el email encontrado y no devuelva nada.
  4. Un callback onNotFound que no reciba ni devuelva nada.

La lógica interna es directa: dentro de la función aplicas find sobre la lista de correos pasándole la condición recibida. Si el resultado es distinto de null, ejecutas onFound con el email encontrado. Si es null, ejecutas onNotFound.

Al invocarla, pasas la lista de emails y defines la condición con una lambda, por ejemplo, que el subject contenga la palabra "urgente". En onFound imprimes el asunto del correo encontrado; en onNotFound, un mensaje de no encontrado. Si cambias "urgente" por "rgente", el callback onNotFound se dispara.

¿Para qué sirven los callbacks onFound y onNotFound? Separan el comportamiento del flujo. Tu función no decide qué hacer en cada caso, solo notifica al código que la llamó, que es quien define la acción.

Este patrón es la base de muchas APIs reactivas y asíncronas que vas a encontrar más adelante cuando trabajes con generics y scope functions.

¿Qué otra función de alto orden te gustaría explorar primero, reduce, groupBy o fold? Cuéntame en los comentarios cómo te fue resolviendo el ejercicio de buscarEmail.