Saltar navegación

20250923-InterfacesFuncionales_1 - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 24 de septiembre de 2025 por Raquel G.

31 visualizaciones

Descargar la transcripción

Venga, pues vamos a repasar un poquito esto, ¿vale? 00:00:00
Vale, pues todos sabéis lo que es una interfaz, lógicamente en Java, ¿verdad? 00:00:05
Una interfaz viene a ser esencialmente una clase que su objetivo normalmente es darte métodos vacíos, 00:00:18
pero que de alguna manera te fijan 00:00:30
una plantilla de comportamiento 00:00:32
entonces te fijan como una especie de plantilla 00:00:33
con métodos vacíos 00:00:36
y luego ya 00:00:37
las clases que quieran lo implementan 00:00:39
entonces el no hacer 00:00:42
directamente la clase sino hacer 00:00:44
que las clases se implementen en una interfaz 00:00:46
permite de alguna 00:00:48
manera 00:00:50
propagar, informar 00:00:51
sobre el nombre de los métodos que va a llamar 00:00:53
esa clase sin necesidad de 00:00:56
dar la clase, porque el nombre de los métodos es en la 00:00:58
interfaz, entonces tú ofreces 00:01:00
la interfaz, todo el mundo 00:01:02
conoce los nombres de los métodos 00:01:04
llama esos métodos, ¿cómo se 00:01:06
van a hacer por dentro? ya 00:01:08
cada uno los hace como le da la gana 00:01:10
en función de la clase que quiera usar 00:01:11
para la implementación, pero al 00:01:13
envolver diferentes 00:01:15
clases bajo una sola interfaz 00:01:17
que implementa 00:01:20
esas clases, pues unifica 00:01:22
los nombres de los métodos, ese es el 00:01:23
objetivo, si hacemos 00:01:25
diferentes clases para acceder a una base 00:01:27
de datos SQL elite, una base de datos 00:01:30
Oracle, una base de datos 00:01:32
MySQL, hacemos 00:01:34
para cada una una clase por libre 00:01:36
pues cada clase 00:01:38
puede tener sus métodos con sus nombres 00:01:40
conectar base de datos 00:01:42
leer, que ahora de repente quiero hacer 00:01:44
la conexión con Oracle 00:01:46
esa clase no me vale, tengo que coger 00:01:48
otra clase y encima cambiar las llamadas 00:01:50
a los métodos porque esa clase, los métodos 00:01:52
se van de otra manera, eso es un desastre 00:01:54
para hacer código y sobre todo para compartirlo 00:01:56
y distribuirlo, lo metemos 00:01:59
todo bajo el paraguas de una 00:02:00
interfaz única, los 00:02:02
métodos tienen un nombre 00:02:04
y ahora ya las clases lo implementan 00:02:06
y por el hecho de implementar, todas 00:02:08
van a usar el mismo nombre de método 00:02:10
luego entonces 00:02:12
si yo cambio de base de datos, cambio la clase 00:02:13
que está debajo, pero mi código 00:02:17
que llama los métodos, ese código no cambia 00:02:19
que es lo que importa, no tengo que 00:02:20
recompilar la clase 00:02:22
Entonces ese es el concepto, de ahí viene el interés de usar interfaces en Java, ¿vale? Y por eso se inventaron. Luego ya a partir de ahí, a partir del concepto de interfaz ya llegaron un montón de pequeñas cosas, pues como por ejemplo que las interfaces no tienen por qué tener todos los métodos vacíos, pueden tener métodos con una implementación por defecto, ¿verdad? 00:02:24
Una interfaz 00:02:45
Pues 00:02:47
Si hacemos un proyectito 00:02:48
Repaso 00:02:53
Interfaces 00:02:56
Venga 00:02:58
Me he equivocado, quería hacer un paquete 00:02:59
Paquete 00:03:20
Vale, si hacemos ahora ya 00:03:23
Vamos a hacer una interfaz 00:03:31
Que no deja de ser 00:03:33
Pues cualquier cosa 00:03:35
Yo que sé 00:03:39
vale, una interfaz 00:03:40
simplemente en lugar de class 00:03:47
tiene interfaz delante, nada más 00:03:49
vale, entonces 00:03:51
está pensada, como decimos, para tener 00:03:53
métodos vacíos y que luego 00:03:55
nosotros cambiemos la clase que tiene debajo 00:03:56
en función de nuestros intereses, pero no cambia 00:03:59
el nombre del método, luego la clase 00:04:01
el programa principal 00:04:03
el principal, la aplicación principal que llama 00:04:05
los métodos, esa no cambia 00:04:07
aunque cambie mi implementación 00:04:09
bueno, pues 00:04:12
pues por ejemplo 00:04:13
este es un método de una interfaz 00:04:22
sin definir, recordad que por defecto son públicos 00:04:29
con lo cual no hay que poner el public porque por defecto son todos públicos 00:04:32
porque la interfaz precisamente está pensada 00:04:35
para homogeneizar 00:04:37
la distribución de código 00:04:40
entonces cuando tú distribuyes código lo distribuyes en paquetes 00:04:43
entonces tú importas los paquetes 00:04:46
Tu código principal no va a estar en el mismo paquete 00:04:48
Entonces vas a necesitar que sea público 00:04:51
Es que no hay otra 00:04:53
Por defecto, por el uso que se le da a las interfaces 00:04:54
Es que tienen que ser públicos 00:04:57
Si no, no tendrían ningún uso 00:04:59
Si yo me descargo un paquete de alguien 00:05:01
Y los métodos que tienen dentro no son públicos, ¿para qué me vale? 00:05:02
Entonces no hace falta ni que lo pongamos 00:05:05
En ese caso es el único caso en el cual 00:05:07
No hace falta poner el public 00:05:09
Vale 00:05:11
Bueno, pues entonces ya sabéis que esta 00:05:12
Interfase se implementa 00:05:15
Y quien implemente la interfaz 00:05:17
Tiene que dar cuerpo obligatoriamente 00:05:19
A ese método 00:05:21
La interfaz puede tener 00:05:22
Todos los métodos que le den la gana 00:05:25
Pero también puede tener métodos 00:05:27
Con implementaciones por defecto 00:05:29
¿Vale? 00:05:32
Por ejemplo, puede tener un método 00:05:33
Sí, pero tú lo puedes sobreescribir 00:05:35
Si quieres, pero eso no te hace falta 00:05:42
¿Vale? 00:05:43
Y métodos con implementaciones 00:05:56
Por defecto puede tener muchos 00:05:58
igual que métodos sin implementación puede tener muchos 00:05:59
también una interfaz 00:06:02
puede ofrecer y ya de paso 00:06:03
pues nos ofrece comportamiento 00:06:05
a lo mejor útil para cosas, puede ofrecer 00:06:08
métodos static, también 00:06:09
vale, una interfaz puede ofrecer 00:06:11
un método static, vale 00:06:15
no, no pasa nada 00:06:17
pero vamos, no hace falta 00:06:26
vale, entonces 00:06:27
los métodos static 00:06:35
pues nos permiten ser llamados a partir 00:06:38
de la implementación directamente 00:06:40
Entonces, bueno, nos ofrecen a lo mejor un código interesante 00:06:42
Pero no es un código de instancia, lógicamente 00:06:46
No es un código de objeto 00:06:49
Los métodos static, por tanto 00:06:50
Al no poder depender del objeto 00:06:54
Porque son static por definición 00:06:56
Los definimos directamente en la interfaz 00:06:58
¿Vale? Los definimos directamente aquí 00:07:01
No tiene sentido sobreescribirlos en la instancia 00:07:03
Porque sobreescribirlos en la instancia que lo implementa 00:07:07
perdón, sobreescribirlos en la clase 00:07:11
que lo implementa, solo tendría 00:07:13
sentido si ese método dependiera del 00:07:15
objeto, solo tendría sentido sobreescribirlo 00:07:17
ahí si va a depender del objeto 00:07:19
pero como es estático, no va a 00:07:20
depender del objeto, es imposible 00:07:23
pues entonces lo escribimos 00:07:24
en la interfaz 00:07:27
¿vale? entonces, bueno, en función 00:07:28
de nuestro diseño de código, pues 00:07:31
si nos interesa ofrecer aquí 00:07:32
algún código estático que no necesite que haya 00:07:34
instancias, lo ofrecemos y ya está 00:07:37
pues esto es una interfaz más o menos 00:07:38
en general y ya sabemos las particularidades 00:07:41
de su implementación, si alguien implementa 00:07:43
esto lo tiene que 00:07:45
implementar 00:07:46
no puedo hacerlo 00:07:47
no tengo que llamar a un objeto 00:07:49
no, si, puedes poner saludar 00:07:51
00:07:53
vale 00:07:55
ahora 00:07:58
puede ocurrir que una interfaz 00:08:00
tenga solamente 00:08:05
un método abstracto 00:08:07
un método por definir 00:08:09
entonces si una interfaz tiene solo 00:08:11
un método por definir 00:08:14
en lugar de muchos, es lo que se llama 00:08:16
una interfaz funcional 00:08:18
¿vale? 00:08:20
esta lo sería, porque tiene solo 00:08:22
un método vacío, abstracto 00:08:24
puede tener 200.000 default y 200.000 static 00:08:26
pero solo tiene un abstracto 00:08:28
entonces 00:08:30
esto se conoce como una interfaz funcional 00:08:31
ya, se le da ese nombre 00:08:34
sin más 00:08:36
¿por qué? 00:08:37
Pues porque ahora los objetos de esta interfaz funcional se les ve, se les interpreta como comportamientos de este único método. 00:08:39
Entonces, cuando uno instancia, vamos a instanciar ahora una clase de esta interfaz funcional, 00:08:51
tiene que ofrecer un único comportamiento que es el del único método abstracto. 00:08:58
Entonces, una interfaz funcional se asocia a un método. 00:09:03
Luego ese es el primer salto que damos para entender que los métodos pueden ser datos. 00:09:09
Un método puede ser un dato. 00:09:15
¿Por qué un método puede ser un dato? 00:09:17
Porque un método puede ser un objeto que implementa una interfaz funcional. 00:09:19
Y un objeto que implementa una interfaz funcional tiene un método dentro, solo uno. 00:09:24
Pues ahí está el dato, en ese método. 00:09:28
Pero bueno, por partes 00:09:31
Esto sería una interfaz funcional 00:09:33
Cuando identificamos que tenemos una interfaz funcional 00:09:35
Es recomendable 00:09:38
Anotarla 00:09:40
Anotarla con la 00:09:41
Anotación funcional interface 00:09:48
Para indicar que es una interfaz funcional 00:09:50
¿Obligatorio? 00:09:51
No es obligatorio 00:09:54
¿Recomendable? Sí 00:09:55
¿Recomendable por qué? 00:09:57
Porque ofrece 00:10:01
Una validación ya en tiempo de compilación 00:10:02
Esto es como el override 00:10:04
cuando sobreescribimos un método 00:10:05
recordad cuando heredamos o implementamos 00:10:07
y sobreescribimos un método 00:10:09
podíamos poner el override o no ponerlo 00:10:11
no es obligatorio, pero si ponemos 00:10:13
el override automáticamente se hace 00:10:15
una validación en tiempo de compilación 00:10:17
que es, a ver, este método que tienes 00:10:19
debajo del override, ¿realmente 00:10:21
su cabecera es idéntica 00:10:23
que uno de la superclase? 00:10:25
porque si no lo es 00:10:28
te voy a dar un error 00:10:29
¿vale? entonces ya te ofrece una validación en tiempo 00:10:30
de compilación, que está muy bien porque tú 00:10:33
O a lo mejor crees que estás sobrescribiendo un método de la superclase 00:10:35
y te has equivocado poniendo un carácter de más. 00:10:39
Si no pones el override, no te enteras. 00:10:41
No te enteras, has puesto el carácter de más, no has puesto el override, 00:10:44
el tipo de combinación, no te enteras. 00:10:46
Cuando luego tu programa llame al método de la superclase, 00:10:48
al que va a llamar al de la superclase, 00:10:52
dices, pero si esto no hace nada, no hace nada, no hace nada. 00:10:54
Claro que no hace nada porque no lo has sobrescrito, 00:10:56
creyendo que si lo has hecho, no lo has hecho. 00:11:00
Pues esa es la ventaja de las anotaciones. 00:11:02
no siempre son obligatorias, ofrecen información, a veces información en tiempo de ejecución 00:11:04
y otras validación en tiempo de compilación como esta. Y esta validación es estupenda 00:11:11
porque si yo me creo que he hecho una interfaz funcional y que luego voy a poder instanciar 00:11:16
con una función, como veremos ahora, etc. Y resulta que no me he dado cuenta porque 00:11:21
he hecho un copia y pega de otra que tengo por ahí de hace dos años. He hecho un copia 00:11:27
y pega y aquí tengo yo 00:11:32
otro método abstracto 00:11:34
entonces automáticamente 00:11:36
si yo he puesto 00:11:38
la anotación, me salta el error 00:11:40
¿vale? porque solo puede tener una 00:11:42
pues no lo he mirado nunca, la verdad 00:11:44
anotación inválida 00:11:48
no es una interfaz funcional 00:11:50
¿vale? 00:11:52
entonces ya no solo por esa validación 00:11:54
en tiempo de compilación, sino porque 00:11:56
todo lo claro que pueda ser un código 00:11:58
mejor, cuanto más legible sea mejor 00:12:00
y las anotaciones, cuando tú ves 00:12:02
el código de alguien, las anotaciones te sitúan 00:12:04
en el objetivo 00:12:06
de esas interfaces 00:12:08
vale, pues ya está 00:12:09
entonces 00:12:11
esta interfaz funcional, si yo ahora la quiero usar 00:12:15
por ejemplo, tengo un 00:12:19
programa por aquí 00:12:23
ay, se me ha olvidado poner el 00:12:24
vale, pues 00:12:38
entonces 00:12:55
yo puedo tener un método 00:12:55
que en lugar de recibir un dato para hacer 00:12:59
cosas, reciba 00:13:01
un comportamiento, una acción 00:13:03
que es la idea 00:13:05
de la programación funcional, por ejemplo 00:13:07
vamos a hacer aquí un método 00:13:09
estático para que lo podamos llamar 00:13:10
desde main, haz algo 00:13:13
y ahora 00:13:20
a este haz algo 00:13:21
le voy a pasar 00:13:23
una instancia de mi interfaz funcional 00:13:25
anterior, entonces la 00:13:28
idea, lo que pasa es que luego con los 00:13:30
lo veremos más claro, la idea es que yo a esta función, a este método, no le estoy pasando, como siempre, 00:13:32
dato, un dato para que trabaje, un nombre, una cadena de cosas, no le estoy pasando un dato, 00:13:40
le estoy pasando una acción, le estoy pasando una acción. Pues, ¿cuál puede ser mi manera de pasarle una acción? 00:13:47
Le tendré que pasar una instancia de la interfaz anterior, porque esa instancia tendrá que haber 00:13:53
sobrescrito el método saludar 00:14:00
y, por tanto, le estoy pasando 00:14:02
la acción 00:14:04
de saludar. 00:14:07
Entonces, yo aquí le 00:14:08
¿cómo se llamaba mi interfaz? 00:14:10
Saludar. Vale. 00:14:13
Pues, entonces, a este método 00:14:24
le voy a pasar, en realidad, lo que le estoy pasando es un 00:14:25
comportamiento. Y ese comportamiento 00:14:28
¿dónde va a estar? Aquí. 00:14:30
Pero, claro, le tendré que pasar a una instancia. 00:14:34
Le tengo que pasar a una instancia porque solamente 00:14:35
yo aquí tengo que pasar siempre 00:14:37
como parámetro, siempre paso cosas que existan 00:14:39
lógicamente, objetos o datos 00:14:43
primitivos, pero algo que exista 00:14:44
algo que sea instanciable 00:14:46
yo no puedo pasar por parámetro algo que no sea 00:14:48
instanciable, entonces aquí siempre 00:14:50
tengo que pasar una instancia 00:14:52
no puede instanciar saludar, como bien sabemos 00:14:54
pues entonces toca hacer una clase 00:14:56
que implemente saludar 00:14:58
entonces 00:15:00
ahora ya 00:15:01
nos podemos hacer, por ejemplo 00:15:07
saludar1 00:15:09
Venga, para que el 1 00:15:11
Queda muy feo 00:15:17
Saludar bien 00:15:18
Pues en saludar bien 00:15:19
Yo quiero que esto 00:15:22
Implemente 00:15:25
Mi interfaz funcional anterior 00:15:26
Saludar 00:15:29
Desde el momento en que 00:15:30
Implementa mi interfaz 00:15:34
Anterior 00:15:36
Tengo que definir este comportamiento 00:15:37
Y solo este, porque no hay más métodos abstractos 00:15:41
Pues por ejemplo 00:15:43
Yo aquí podría poner 00:15:44
y puedo tener todas las implementaciones 00:15:46
que yo quiera 00:16:01
vale 00:16:02
mi aplicación puede saludar de mil maneras 00:16:04
implement 00:16:07
saludar 00:16:26
vale, al implementar saludar 00:16:28
vale, entonces 00:16:31
ahora ya 00:16:47
este método, en lugar de llamarlo 00:16:49
haz algo, vamos a llamarlo saludar 00:16:53
saludar, vale 00:16:55
pues a este método 00:16:59
Yo le tengo que pasar 00:17:03
Una instancia de este de aquí 00:17:05
Y en función de la instancia que le pase 00:17:07
Saludar hace una cosa u otra 00:17:09
Entonces 00:17:10
Bueno, primero tengo que hacer el método 00:17:11
Ese punto 00:17:17
Este, ¿vale? 00:17:19
Saludar 00:17:27
Ah, bueno, espérate 00:17:28
Porque el nombre pasado 00:17:31
Se recibía un parámetro 00:17:33
Cómo se encuentra, vamos a ponerle 00:17:35
Para que te diga 00:17:37
Quién 00:17:39
Voy a que le pasa un parámetro 00:17:39
Entra, nombre 00:17:42
Concatenamos 00:17:51
Con la interrogación 00:17:55
Vale 00:17:57
Porque pasarle el parámetro si no lo voy a usar 00:17:58
Vale 00:18:01
Cómo se encuentra 00:18:03
Saludar mal 00:18:11
Este 00:18:14
Y este de aquí 00:18:29
Sí, pero bueno 00:18:32
Como tiene que implementarlo tal cual 00:18:37
Podríamos pasar de él, pero bueno 00:18:39
Su nombrecito 00:18:41
Venga 00:18:44
Entonces, ahora voy a saludar 00:18:44
¿Vale? 00:18:48
Como estamos usando un parámetro 00:18:50
Pues vamos a pasar aquí a quien queremos saludar 00:18:51
Y ahora yo 00:18:53
esta podría ser la implementación de mi método 00:18:56
entonces ahora este método 00:19:01
tiene dos datos 00:19:03
un dato es el nombre de quien voy a saludar 00:19:05
ahí conceptualmente no cambia nada 00:19:08
es un dato 00:19:09
como los que conocemos, un nombre, un número 00:19:10
lo que sea 00:19:13
y el segundo dato o parámetro que tiene 00:19:14
es una manera de saludar 00:19:17
es decir, un comportamiento 00:19:19
este método ahora depende 00:19:21
de una forma 00:19:23
de actuar y de un dato 00:19:25
¿vale? 00:19:27
Entonces, una interfaz funcional es una forma de actuar que, de nuevo, repetimos, se puede pasar como parámetro. 00:19:28
Claro, de hecho, ahora podemos saludar de muchas maneras. 00:19:37
Le vamos a que nos diga cómo se llama. 00:19:41
Vale. 00:19:52
Y ahora ya. 00:20:27
Ahora, cuando llamemos a saludar, ¿vale? 00:20:37
cuando llamemos a saludar 00:20:40
vamos a saludar bien y saludar mal 00:20:42
a este tío 00:20:44
entonces, este tío se llama nombre 00:20:45
¿vale? 00:20:48
entonces 00:21:02
en estas dos llamadas 00:21:02
el dato lo he pasado 00:21:04
lo que me falta pasar es la forma de saludar 00:21:06
es decir, el comportamiento 00:21:08
el comportamiento es 00:21:10
la instancia correspondiente 00:21:12
de esa interfaz 00:21:15
funcional que me interesa 00:21:17
entonces 00:21:18
así 00:21:19
le paso el primer comportamiento 00:21:27
porque le paso una instancia de esa 00:21:30
interfaz funcional 00:21:31
y así le paso el segundo comportamiento 00:21:32
pues estoy pasando dos 00:21:38
cosas, la forma 00:21:40
de saludar que es 00:21:42
la instancia 00:21:43
de la interfaz 00:21:44
funcional y ya un dato porque en este ejemplo 00:21:47
en concreto además necesita un dato 00:21:49
vale 00:21:51
entonces 00:22:06
es el mismo código 00:22:11
es llamada 00:22:14
saludar 00:22:16
el mismo 00:22:18
lo que cambia es lo que yo le paso aquí 00:22:19
¿vale? 00:22:22
vale 00:22:45
¿hasta aquí está claro? 00:22:46
está claro 00:22:48
¿verdad? 00:22:50
bueno pues efectivamente se ve o se vislumbra 00:22:52
que esto es bastante útil 00:22:55
operativo, da mucha flexibilidad 00:22:56
y sobre todo me permite unos esquemas de diseño 00:22:58
muchísimo más 00:23:01
con muchísima más riqueza 00:23:02
aquí lo único que ha sido un poquito 00:23:04
farragoso es el paso 00:23:07
de tener que hacer 00:23:09
la clase 00:23:11
que implementa esta 00:23:13
porque tengo que hacer toda una clase entera 00:23:14
solamente 00:23:17
para esta línea 00:23:19
y toda esta clase entera 00:23:21
solamente 00:23:23
para esta línea 00:23:24
entonces lo que se nos ha hecho un poquito pesado 00:23:26
es tener que hacer una clase entera 00:23:29
que implemente la interfaz 00:23:32
solo para ofrecer este comportamiento. 00:23:33
No pasa nada, se puede hacer. 00:23:37
Lo que pasa es que Java te ofrece 00:23:38
una manera más dinámica 00:23:40
de crear estos comportamientos 00:23:42
más allá de hacer una clase 00:23:46
que lo implemente 00:23:48
y meter ese comportamiento dentro de esto de aquí. 00:23:49
Que es a través de las funciones. 00:23:53
¿No suena bien? 00:23:56
esto no es nada 00:24:05
hombre a ver 00:24:09
todo es mucho 00:24:10
en función del grado de profundidad 00:24:11
que se quiera meter uno 00:24:12
para el andar por casa 00:24:13
que andamos nosotros 00:24:16
para el andar por casa 00:24:17
esto es muy sencillo 00:24:18
para meterse en profundidades 00:24:20
que es lo que haréis 00:24:21
cuando te pongan a ti 00:24:22
a trabajar en una cosa concreta 00:24:23
sobre esto 00:24:25
entonces te metes en profundidades 00:24:26
pero tienes el hilo del que tirar 00:24:27
que eso es lo que se supone 00:24:29
que tenéis que coger en el ciclo 00:24:31
el hilo del cual tirar 00:24:32
para te pongan donde te pongan, te dan un bofetón 00:24:33
y te vas para allá, no pasa nada 00:24:36
sé dónde tirar para sobrevivir, me dan otro 00:24:37
bofetón y voy para acá, sé dónde tirar 00:24:39
no estoy en Alvis por la vida 00:24:41
y vale 00:24:44
porque ChatGPT es maravilloso 00:24:45
y útil para el que está 00:24:48
situado, entonces para el que 00:24:49
está situado en el mundo 00:24:51
es maravilloso 00:24:53
pero para el que no está situado 00:24:55
es un desastre porque él 00:24:57
pues no, si tú no le haces las preguntas 00:24:59
correctas jamás vas a obtener las preguntas 00:25:01
correctas, las respuestas correctas 00:25:03
lógicamente, entonces hay que 00:25:05
situarse, ¿qué es lo que hacemos aquí? 00:25:07
pues un poco tocar un poco todas las 00:25:09
cosas para saber de dónde tirar 00:25:11
bueno, pues entonces, ¿cómo podemos 00:25:13
usar una función lambda 00:25:15
para 00:25:17
dar una 00:25:19
instancia a una 00:25:21
interfaz 00:25:23
funcional? ¿qué es lo que queríamos 00:25:25
aquí? instanciar una interfaz funcional 00:25:27
porque aquí hemos 00:25:29
necesitado 00:25:31
instanciar 00:25:32
una interfaz funcional para 00:25:35
aquí hemos 00:25:37
necesitado instanciar una interfaz 00:25:39
funcional para pasar el comportamiento 00:25:42
¿no? 00:25:43
que el rollo ha sido, repito, tener que crear esta clase 00:25:45
el nudo rollo, pues no hace falta 00:25:47
en realidad crear esa clase intermedia 00:25:49
es decir 00:25:51
¿eh? 00:25:52
no hace falta 00:25:54
por ejemplo 00:25:56
vamos a hacerlo 00:25:58
Yo quiero crear una instancia 00:26:00
De este de aquí 00:26:05
Tal y como lo hemos hecho ahora 00:26:06
Por ejemplo tendría aquí 00:26:09
Saludar S1 00:26:10
Haría esto 00:26:12
Vamos a hacerlo en dos líneas 00:26:16
Para que se vea mejor la diferencia 00:26:21
Y saludar S2 00:26:23
Saludar mal 00:26:26
Vale, esto es lo que hemos hecho 00:26:27
¿No? Separándolo en dos líneas 00:26:30
S1, S2 00:26:32
Vale 00:26:36
bueno pues como puedo yo hacer esto 00:26:37
que es 00:26:40
instanciar 00:26:41
como puedo hacer yo hacer esto, instanciar 00:26:43
sin tener que crear 00:26:46
sin tener que tener creada la clase 00:26:47
saludar bien, pues lo que puedo hacer es 00:26:49
dar directamente aquí 00:26:51
el código del método, punto pelota 00:26:53
doy el código del método 00:26:56
y se convierte en una 00:26:57
creación de instancia 00:27:00
de esta interfaz cuya implementación 00:27:01
del método interno es la que yo doy aquí 00:27:04
doy aquí el código del método 00:27:06
y eso es una función lambda 00:27:08
entonces aquí podemos dar 00:27:10
aquí en lugar de esto 00:27:11
sustituimos esto 00:27:18
por una función lambda 00:27:20
y la función lambda 00:27:23
¿qué es? 00:27:26
es la implementación del método abstracto 00:27:27
es solamente eso 00:27:30
si, un método lambda 00:27:31
es una 00:27:39
implementación 00:27:40
de una instancia 00:27:42
de una interfaz funcional 00:27:43
la implementación de una interfaz funcional 00:27:45
implementación del método astral 00:27:46
entonces, tú solamente puedes proveer 00:27:49
una lambda 00:27:54
a quien te esté pidiendo una interfaz funcional 00:27:54
a quien te la esté pidiendo 00:27:57
vale, pues 00:27:59
los principios de 00:28:01
programación de la función lambda 00:28:03
para hacerlo de andar por casa 00:28:05
son muy sencillos, las funciones lambda 00:28:07
tienen esta cosita, tan bona 00:28:09
que separa 00:28:11
parámetros de entrada de ese método 00:28:12
De código de salida 00:28:15
¿Vale? 00:28:17
Los parámetros de entrada del método 00:28:18
Van separados por comas entre paréntesis 00:28:20
Y va con su nombre tal cual 00:28:23
Ni tipo ni nada 00:28:26
Porque el tipo ya 00:28:28
Se infiere luego en tiempo de ejecución 00:28:29
En función de quien va a estar llamando 00:28:33
Ya se va a inferir 00:28:34
Ahí no hay que poner tipo 00:28:35
Y aquí el código que sea 00:28:36
Entonces 00:28:40
esto es una función lambda válida 00:28:42
que sirve para implementar un método abstracto 00:28:46
que reciba dos parámetros 00:28:50
y te devuelve, color de retorno, la suma de los dos 00:28:52
o sea, esta sería un lambda válido 00:28:55
para un método que sea algo así 00:28:57
por ejemplo 00:29:00
int suma int a int b 00:29:01
¿vale? 00:29:08
si yo tengo una interfaz funcional 00:29:11
cuyo método abstracto es este, me devuelve 00:29:15
un valor y necesita 00:29:17
dos parámetros 00:29:18
esta lambda encaja en él perfectamente 00:29:19
bueno, pues 00:29:22
aquí en nuestro caso particular 00:29:28
cuando solamente 00:29:30
hay un parámetro de entrada 00:29:32
no se pone entre paréntesis 00:29:33
se pone 00:29:35
la x, y ya está 00:29:36
se suelen llamar las parámetros de entrada x, y, z 00:29:39
¿vale? 00:29:41
puede no tener parámetros de entrada 00:29:43
el método, entonces no se pone nada 00:29:45
hay pequeños, la sintaxis 00:29:47
de la función lambda 00:29:49
pues uno la mira sintaxis para hacer una función lambda 00:29:50
y no tiene mayor historia 00:29:53
es ir probando y se acabó 00:29:55
que sepamos simplemente que la idea es esa 00:29:57
este simbolito, parámetros de entrada 00:29:59
aquí separados por comas entre paréntesis 00:30:02
y no es menos que sea solo uno 00:30:04
y aquí el código que puede ser más de una línea 00:30:05
puede ser línea separada por un poco de coma 00:30:07
lo que queremos que haga el método 00:30:09
Que puede devolver algo o puede no devolver nada 00:30:10
No he puesto ahí el return 00:30:13
¿Vale? Debería 00:30:14
Bueno, pues entonces 00:30:15
Aquí si pasamos del saludar bien y del saludar mal 00:30:19
Vamos a instanciar 00:30:21
Ese 1 y ese 2 pasando de esas clases 00:30:26
Bueno, pues a ver 00:30:29
¿Qué tipo de función lambda deberíamos ofrecer aquí? 00:30:34
Una que recibe un único parámetro 00:30:38
Y lo que hace es mostrar este mensajito 00:30:40
Pues vamos a hacer eso mismo 00:30:45
Es muy fácil 00:30:47
De nuevo 00:30:50
Hasta la complejidad que se quiera meter uno 00:30:51
Pues x y ahora 00:30:54
Vamos a dejarla tal cual 00:30:57
Cambiando nombre por x 00:31:11
Lógicamente 00:31:15
Vale 00:31:16
Como veis 00:31:20
Me la coge, ya está, ya tengo mi función lambda 00:31:22
Que quiero instanciar 00:31:25
Porque quiero hacer dos instancias 00:31:30
diferentes para 00:31:34
dos saludos 00:31:35
o es lo mismo 00:31:37
son los parámetros de entrada 00:31:38
al método abstracto que tenga esta interfaz 00:31:57
esta interfaz tiene su 00:31:59
método abstracto único 00:32:01
con sus parámetros de entrada 00:32:03
y su posible valor de salida o no 00:32:04
pues los parámetros de entrada 00:32:08
tendrán que estar aquí separados por comas 00:32:10
dándole el nombre que tú quieras 00:32:12
la idea de la función lambda 00:32:13
es que quede cortita porque va a ir una línea 00:32:15
entonces aquí no aplica 00:32:17
lo que hemos dicho siempre 00:32:20
de por favor nombres de identificadores 00:32:22
lo más explicativo posible 00:32:24
cuando creéis una variable 00:32:26
que es el apellido de alguien 00:32:27
no la llaméis x, llamad apellido 00:32:30
pues todas esas reglas de estilo 00:32:32
aquí no aplican 00:32:34
porque aquí lo que queremos es códigos cortitos 00:32:36
y legibles 00:32:38
entonces aquí a los parámetros de entrada 00:32:39
se le puede llamar x, y, t 00:32:41
en el segundo no tiene que ser y 00:32:44
puede ser X 00:32:46
que más da, son funciones landas independientes 00:32:47
entonces 00:32:51
mientras yo no la cambie 00:32:55
es una instancia de esta interfaz 00:32:56
cuya implementación de su método es esta 00:32:58
¿vale? S1 00:33:00
podría luego darle otra función landa 00:33:02
pues la ha instanciado otra vez 00:33:04
con otra implementación 00:33:06
entonces esto hace que sea muchísimo más ágil 00:33:08
no tengo que hacer una implementación 00:33:10
por cada comportamiento distinto 00:33:13
doy ese comportamiento 00:33:15
a través de la función en la acta. 00:33:16
No, no, no. 00:33:20
Las clases no me hacen falta 00:33:20
porque las clases las hemos hecho 00:33:21
las clases las hemos hecho 00:33:24
para indicar 00:33:27
cuál es el comportamiento 00:33:29
que yo quiero para esa instancia. 00:33:31
Pero como ese comportamiento 00:33:33
en el momento de instanciarlo 00:33:35
ya se lo voy a dar aquí 00:33:37
en el momento de instanciarlo 00:33:40
estoy rellenando el método 00:33:43
en el momento de instanciarlo 00:33:45
Luego no necesito hacer la clase que lo implementa 00:33:46
Porque aquí ya estoy rellenando el método 00:33:49
¿Vale? 00:33:51
Y yo puedo redefinir 00:33:55
Esta interfaz siempre que quiera con funciones lambda 00:33:57
Distintas 00:34:00
Vale, si ejecutamos esto 00:34:01
Pues hará lo mismo 00:34:06
¿Vale? 00:34:07
¿Algo no te cuadra? 00:34:12
00:34:27
¿El qué? 00:34:27
El método de abajo 00:34:29
¿Cómo el método de abajo? 00:34:30
Sí, a ver, el método de abajo, claro, puedo pasarle aquí directamente, ya me puedo saltar este paso, efectivamente, claro. 00:34:38
Esto como le quedo no más claro, yo aquí tengo que pasar una instancia de segundo, eso está claro. 00:34:52
Entonces, o bien la creo antes 00:35:00
O la paso directamente 00:35:03
Es decir, nosotros podríamos aquí 00:35:04
En lugar de llamar 00:35:07
Crearlas primero 00:35:09
Y luego pasarlas 00:35:13
Podemos también 00:35:14
Hacerlo directamente 00:35:16
A saludar 00:35:18
Es como pasar el new, como antes hemos pasado el new 00:35:20
Ah, pues espérate 00:35:22
Porque esto era lo que yo quería decir ahora 00:35:24
Que también es 00:35:26
Ahora me dices lo otro 00:35:27
Vale, entonces 00:35:29
Porque ese me 00:35:31
Ah, vale 00:35:37
Ay, que no quería esto 00:35:38
Ahí, vale 00:35:41
Coma, nombre 00:35:42
Y aquí 00:35:56
Vale 00:35:57
Con este 00:35:59
System.out tan largo se pierde la 00:36:22
Perspectiva 00:36:23
Vale 00:36:25
Y ya podríamos, ahora vamos con lo 00:36:41
Tuyo, y ya podríamos 00:36:44
Dar el siguiente salto que lo hace más 00:36:46
depende de lo claro que quiera verlo uno en el código 00:36:48
¿no? 00:36:51
esto es como cuando hacemos un objeto 00:36:53
lo instanciamos con new 00:36:55
y pasamos el objeto 00:36:57
o pasamos el new directamente 00:36:58
depende de cómo quieras hacer todo el código 00:37:00
si quieres dejarlo más claro o no quieres dejarlo claro 00:37:03
si quieres conservar la referencia 00:37:05
y no quieres conservarla 00:37:07
si quieres conservar la referencia 00:37:08
tienes que guardarla en un sitio 00:37:10
pero si te da igual conservarla 00:37:12
porque solo la vas a usar una vez 00:37:15
Pues pasas el new directamente 00:37:16
Pues aquí igual 00:37:19
Yo a saludar, a este método saludar 00:37:21
Le tengo que pasar 00:37:23
Una instancia 00:37:25
De una interfaz funcional, obligatorio 00:37:27
Y este parámetro 00:37:29
Pues una instancia de una interfaz funcional 00:37:30
Es una función lambda, lo que acabamos de decir 00:37:33
Pues le paso la función lambda tal cual 00:37:35
Le paso la función lambda tal cual 00:37:37
La queja queda un poco larga porque tiene el sistema 00:37:39
Outprintln 00:37:41
Que no lo puedo abreviar porque 00:37:42
lo concatenamos con esto, lo de abreviar lo veremos 00:37:45
ahora, ¿vale? pero le paso 00:37:47
la función lambda tal cual 00:37:49
claro, x barrita 00:37:50
le paso la función lambda 00:37:55
y le estoy pasando la instancia, ¿vale? 00:37:57
¿y tu duda cuál era? 00:38:03
lo que yo digo es que 00:38:04
estás creando la instancia saludar 00:38:05
ese 1, ¿no? 00:38:07
la función lambda 00:38:08
ya tienen los métodos 00:38:10
ya puedes hacer ese 1.saludar 00:38:13
Podría llamar a ese uno 00:38:15
Punto saludar 00:38:21
¿Vale? 00:38:23
Y pasar el nombre, ¿vale? 00:38:25
Lo que pasa es que no sería el uso 00:38:26
No sería el uso 00:38:28
Ya, pero bueno 00:38:30
Sí, pero a ver, lo que estoy reflejando 00:38:36
Lo que estoy reflejando es que a un método 00:38:39
Le puedes pasar comportamiento 00:38:41
En este caso este método a su vez 00:38:42
saluda. O sea, los dos métodos hacen lo mismo. 00:38:45
Pero a lo mejor este método de abajo 00:38:47
podría hacer otra cosa con este comportamiento. 00:38:49
¿Vale? No tendría por qué 00:38:52
hacer lo mismo. ¿Vale? 00:38:53
Venga, pues paramos un momentico. 00:38:59
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Segundo Curso
Subido por:
Raquel G.
Licencia:
Todos los derechos reservados
Visualizaciones:
31
Fecha:
24 de septiembre de 2025 - 18:03
Visibilidad:
Clave
Centro:
IES ROSA CHACEL
Duración:
39′ 01″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
148.68 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid