Contenido del curso
Entendiendo las partes de la programación funcional
- 2

Funciones en Programación Funcional: Conceptos Básicos
03:15 min - 3

Funciones como Ciudadanos de Primera Clase en Programación
02:39 min - 4

Funciones Puras: Concepto y Ejemplos Prácticos
04:05 min - 5

Efectos Secundarios en Programación y su Impacto en el Código
03:12 min - 6

Funciones de Orden Superior en Programación
02:28 min - 7

Funciones Lambda en Programación Funcional Java
03:30 min - 8

Inmutabilidad de Datos en Programación Funcional con Java
11:16 min
Functional Programming en Java
- 9

Programación Funcional en Java SE: Conceptos y Prácticas
00:06 min - 10

Programación Funcional en Java: Práctica y Ejemplos en IntelliJ
02:48 min - 11

Programación Funcional en Java: Creación y Uso de Funciones
04:03 min - 12

Programación Funcional con Predicados en Java
04:57 min - 13

Interfaz Consumer y Supplier en Java: Uso y Ejemplos Prácticos
03:54 min - 14

Funciones Java para Transformación de Datos y Operaciones Binarias
07:10 min - 15

Creación y Uso de Interfaces Funcionales Personalizadas en Java
08:51 min - 16

Métodos de Referencia en Programación Funcional Java
04:46 min - 17

Inferencia de tipos en Java: funciones y métodos
03:53 min - 18

Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones
Viendo ahora - 19

Interfaz Funcional en Java: Creación y Uso de Métodos Default
04:59 min - 20

Encadenamiento de Llamadas en Programación Orientada a Objetos
03:52 min - 21

Composición de Funciones en Programación Funcional
06:06 min
Optional y Streams: Datos mas interesantes
- 22

Uso de la Clase Optional en Java para Manejo de Valores Nulos
12:59 min - 23

Manipulación de Streams en Java: Operaciones y Limitaciones
10:18 min - 24

Programación Funcional en Java: Uso de Streams y Operaciones Terminales
07:21 min - 25

Operaciones de Stream en Java: Intermedias y Finales
05:05 min - 26

Operaciones y Concurrente con Stream en Java
05:51 min - 27

Operaciones Terminales en Java Streams
06:18 min - 28

Operaciones Intermedias en Streams de Java
09:21 min - 29

Conversión de Strings a Listas de Enteros en Java
06:14 min
Todo junto: Proyecto Job-search
- 30

Construcción de Proyecto para Buscar Empleo Usando APIs
01:17 min - 31

Configuración y Uso de Gradle en Proyectos Java con IntelliJ
03:23 min - 32

Creación de una Herramienta de Búsqueda de Trabajo en Terminal
01:51 min - 33

Creación de Puntos de Entrada y Dependencias en Proyectos Java
05:53 min - 34

Creación de APIs RESTful con Feign y Spring Boot
09:30 min - 35

Creación de una Interfaz de Línea de Comandos con JCommander
13:05 min - 36

Validación de Argumentos en Terminal con Clases en Ciel
04:31 min - 37

Procesamiento de Argumentos y Solicitudes API en Java
11:38 min - 38

Creación de API para búsqueda de empleos con Java y CLI
08:31 min
Conclusiones
Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones
Resumen
Cuando trabajas con programación funcional en Java, llega un momento en el que almacenar cada función en una variable resulta innecesario. Ahí es donde las lambdas cobran protagonismo: son funciones anónimas que existen solo en el fragmento de código donde se usan, sin nombre ni referencia posterior. Comprender su sintaxis y cuándo aplicarla es fundamental para escribir código limpio y expresivo.
¿Qué son las lambdas y por qué usarlas?
Una lambda es una función que no está almacenada en ningún lugar del código [01:10]. Si defines una operación dentro de un forEach, por ejemplo, esa lógica vive únicamente en ese punto. No puedes reutilizarla después porque no tiene nombre ni referencia.
- Se usan para casos únicos con lógica muy simple.
- Evitan crear variables o métodos adicionales cuando la operación es breve.
- Funcionan como el cuerpo de una functional interface.
El ejemplo más directo es recorrer una lista de cursos con forEach y pasar una lambda que imprima cada elemento por pantalla [02:00]. Aunque podrías usar un operador de referencia como System.out::println, la versión lambda deja claro que estás definiendo comportamiento en el acto.
¿Cómo varía la sintaxis según los parámetros?
La sintaxis de las lambdas cambia dependiendo de cuántos parámetros reciba la función y de cuántas líneas tenga el cuerpo.
¿Cómo se escribe una lambda sin argumentos?
Cuando tu functional interface no recibe ningún parámetro, la sintaxis usa paréntesis vacíos seguidos de la flecha [03:30]:
java () -> 42
Esto indica que la lambda no necesita datos de entrada y retorna directamente el valor. Java infiere el retorno sin necesidad de escribir return.
¿Qué sintaxis aplica con un solo parámetro?
Con un Predicate, por ejemplo, la lambda recibe un solo dato. Basta con nombrar el parámetro, agregar la flecha y escribir la expresión [04:40]:
java usarPredicado(text -> text.isEmpty());
No hace falta declarar el tipo de dato ni la palabra return. Los predicados siempre devuelven un booleano, así que Java entiende que text.isEmpty() es el valor de retorno.
¿Y cuando hay dos o más parámetros?
Al trabajar con una BiFunction, necesitas encerrar los parámetros entre paréntesis [05:50]:
java usarBiFunction((x, y) -> x + y);
Esta estructura recibe dos valores y devuelve un resultado directamente. La flecha (->) se forma con un guion seguido del signo mayor que; algunos editores la renderizan como un solo carácter visual, pero en realidad son dos caracteres separados [06:30].
¿Qué pasa cuando el cuerpo necesita varias líneas?
Si tu lambda requiere más de una operación, agregas llaves (braces) para definir un cuerpo más complejo [07:00]:
java usarBiFunction((x, y) -> { System.out.println("x: " + x + ", y: " + y); return x - y; });
- Al usar llaves, Java necesita la palabra
returnde forma explícita. - En una sola expresión sin llaves, el retorno es implícito.
- Esta regla aplica para cualquier cantidad de parámetros.
También existe el caso de una función que no recibe parámetros y no retorna nada [08:20]. Para eso puedes crear una functional interface con un método void:
java usarNada(() -> { System.out.println("Hola, alumno"); });
Los paréntesis vacíos indican cero argumentos y las llaves contienen operaciones sin return, porque el tipo de retorno es void.
¿Se pueden declarar tipos explícitos en los parámetros?
Sí. Aunque no es habitual en proyectos del día a día, puedes escribir el tipo directamente [09:40]:
java usarBiFunction((Integer x, Integer y) -> x * y);
Un detalle importante: las functional interfaces operan sobre objetos, no sobre tipos primitivos como int, char o boolean [10:00]. Por eso debes usar Integer en lugar de int. Esta distinción entre tipos primitivos y sus clases envolventes (wrapper classes) es clave para evitar errores de compilación.
Al trabajar con listas, IntelliJ sugiere que el forEach necesita un Consumer de un tipo que extienda de la clase base, indicándolo con la palabra super [10:40]. Esto refleja que puedes generar lambdas que trabajen con subtipos, siempre que la lambda esté definida para el tipo correspondiente.
¿Ya estás usando lambdas en tus proyectos? Comparte en los comentarios qué sintaxis te resulta más natural y en qué situaciones prefieres un operador de referencia.