Java funcional: colecciones, generics y streams

Escribir tipos genéricos propios y procesar colecciones con streams, en vez de bucles a mano.

13 aulas · 10 horas de práctica · en el navegador, sin instalar nada

Temario

  1. Colecciones I: List y Set — List guarda en orden y permite repetidos; Set no repite nada y no promete ningún orden. contains() de las dos usa equals() por debajo.
  2. Colecciones II: Map — Map asocia una clave con un valor. put/get/containsKey/getOrDefault, y cuándo elegir List, Set o Map.
  3. Generics I: clases genéricas propias — Antes de List<T> ya usaste generics sin escribirlos. Ahora los escribís: una clase con un parámetro de tipo evita el cast desde Object y el error que ese cast puede esconder.
  4. Generics II: bounded types y wildcards — <T extends Comparable<T>> exige que T se pueda comparar. List<? extends Number> acepta cualquier lista de números, para leerla — no para escribirle cualquier cosa.
  5. Interfaces funcionales y lambdas — Una interfaz con un solo método abstracto se puede implementar con una expresión chica: una lambda. Function, Predicate, Consumer y Supplier son las cuatro formas más usadas.
  6. Taller — Motor de recomendaciones — Una clase genérica que filtra un catálogo con un Predicate<T> y elige el mejor con un Function<T,R> — el mismo motor sirve para películas, para números, para lo que sea.
  7. Method references — Cuando una lambda solo llama a un método que ya existe, `Clase::metodo` dice lo mismo sin repetir el nombre del parámetro.
  8. Streams I: el pipeline — stream() abre un pipeline: filter, map y sorted lo transforman; count, reduce, anyMatch/allMatch y findFirst lo cierran. Ninguna operación intermedia corre sola.
  9. Streams II: collect() y Collectors — collect() junta el resultado de un stream en una estructura. Collectors.joining arma un texto; Collectors.groupingBy + counting agrupa y cuenta, todo en un pipeline.
  10. Optional y Comparator — Optional hace explícito que un valor puede faltar, en vez de devolver null. Comparator arma órdenes a medida, sin tocar la clase que se ordena.
  11. Inmutabilidad, y cierre del curso — List.of()/Map.of() son inmutables: mutarlas lanza una excepción, a propósito. Preferir inmutable por defecto, y una vuelta final atando streams, generics y lambdas.
  12. Taller — Reporte con streams — Agrupar, ordenar y resumir una lista de ventas con el pipeline completo: groupingBy + un downstream de suma, sorted + Comparator, y max() + Optional para el resumen final.
  13. Taller — Restaurante en llamas — Una cola de pedidos que se atiende en el orden en que llegan, después por prioridad con un PriorityQueue<T> y un Comparator, y por último sin entregar dos veces el mismo plato — Queue, Comparator y Set trabajando sobre el mismo problema.

Es parte de