1 00:00:00,000 --> 00:00:05,919 Venga, pues vamos a repasar un poquito esto, ¿vale? 2 00:00:05,919 --> 00:00:18,019 Vale, pues todos sabéis lo que es una interfaz, lógicamente en Java, ¿verdad? 3 00:00:18,239 --> 00:00:29,980 Una interfaz viene a ser esencialmente una clase que su objetivo normalmente es darte métodos vacíos, 4 00:00:30,000 --> 00:00:32,219 pero que de alguna manera te fijan 5 00:00:32,219 --> 00:00:33,880 una plantilla de comportamiento 6 00:00:33,880 --> 00:00:36,380 entonces te fijan como una especie de plantilla 7 00:00:36,380 --> 00:00:37,619 con métodos vacíos 8 00:00:37,619 --> 00:00:39,340 y luego ya 9 00:00:39,340 --> 00:00:42,140 las clases que quieran lo implementan 10 00:00:42,140 --> 00:00:44,399 entonces el no hacer 11 00:00:44,399 --> 00:00:46,320 directamente la clase sino hacer 12 00:00:46,320 --> 00:00:48,399 que las clases se implementen en una interfaz 13 00:00:48,399 --> 00:00:50,560 permite de alguna 14 00:00:50,560 --> 00:00:51,020 manera 15 00:00:51,020 --> 00:00:53,899 propagar, informar 16 00:00:53,899 --> 00:00:56,299 sobre el nombre de los métodos que va a llamar 17 00:00:56,299 --> 00:00:58,299 esa clase sin necesidad de 18 00:00:58,299 --> 00:01:00,359 dar la clase, porque el nombre de los métodos es en la 19 00:01:00,359 --> 00:01:02,240 interfaz, entonces tú ofreces 20 00:01:02,240 --> 00:01:04,219 la interfaz, todo el mundo 21 00:01:04,219 --> 00:01:06,099 conoce los nombres de los métodos 22 00:01:06,099 --> 00:01:08,319 llama esos métodos, ¿cómo se 23 00:01:08,319 --> 00:01:10,120 van a hacer por dentro? ya 24 00:01:10,120 --> 00:01:11,939 cada uno los hace como le da la gana 25 00:01:11,939 --> 00:01:13,920 en función de la clase que quiera usar 26 00:01:13,920 --> 00:01:15,980 para la implementación, pero al 27 00:01:15,980 --> 00:01:17,859 envolver diferentes 28 00:01:17,859 --> 00:01:20,340 clases bajo una sola interfaz 29 00:01:20,340 --> 00:01:22,140 que implementa 30 00:01:22,140 --> 00:01:23,719 esas clases, pues unifica 31 00:01:23,719 --> 00:01:25,939 los nombres de los métodos, ese es el 32 00:01:25,939 --> 00:01:27,819 objetivo, si hacemos 33 00:01:27,819 --> 00:01:30,560 diferentes clases para acceder a una base 34 00:01:30,560 --> 00:01:32,819 de datos SQL elite, una base de datos 35 00:01:32,819 --> 00:01:34,939 Oracle, una base de datos 36 00:01:34,939 --> 00:01:36,540 MySQL, hacemos 37 00:01:36,540 --> 00:01:38,799 para cada una una clase por libre 38 00:01:38,799 --> 00:01:40,459 pues cada clase 39 00:01:40,459 --> 00:01:42,280 puede tener sus métodos con sus nombres 40 00:01:42,280 --> 00:01:44,400 conectar base de datos 41 00:01:44,400 --> 00:01:46,640 leer, que ahora de repente quiero hacer 42 00:01:46,640 --> 00:01:48,079 la conexión con Oracle 43 00:01:48,079 --> 00:01:50,640 esa clase no me vale, tengo que coger 44 00:01:50,640 --> 00:01:52,519 otra clase y encima cambiar las llamadas 45 00:01:52,519 --> 00:01:54,579 a los métodos porque esa clase, los métodos 46 00:01:54,579 --> 00:01:56,739 se van de otra manera, eso es un desastre 47 00:01:56,739 --> 00:01:59,120 para hacer código y sobre todo para compartirlo 48 00:01:59,120 --> 00:02:00,920 y distribuirlo, lo metemos 49 00:02:00,920 --> 00:02:02,760 todo bajo el paraguas de una 50 00:02:02,760 --> 00:02:04,859 interfaz única, los 51 00:02:04,859 --> 00:02:06,359 métodos tienen un nombre 52 00:02:06,359 --> 00:02:08,560 y ahora ya las clases lo implementan 53 00:02:08,560 --> 00:02:10,960 y por el hecho de implementar, todas 54 00:02:10,960 --> 00:02:12,479 van a usar el mismo nombre de método 55 00:02:12,479 --> 00:02:13,800 luego entonces 56 00:02:13,800 --> 00:02:17,020 si yo cambio de base de datos, cambio la clase 57 00:02:17,020 --> 00:02:19,080 que está debajo, pero mi código 58 00:02:19,080 --> 00:02:20,879 que llama los métodos, ese código no cambia 59 00:02:20,879 --> 00:02:22,319 que es lo que importa, no tengo que 60 00:02:22,319 --> 00:02:24,120 recompilar la clase 61 00:02:24,120 --> 00:02:45,960 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? 62 00:02:45,960 --> 00:02:47,379 Una interfaz 63 00:02:47,379 --> 00:02:48,819 Pues 64 00:02:48,819 --> 00:02:53,659 Si hacemos un proyectito 65 00:02:53,659 --> 00:02:56,990 Repaso 66 00:02:56,990 --> 00:02:58,590 Interfaces 67 00:02:58,590 --> 00:02:59,250 Venga 68 00:02:59,250 --> 00:03:20,780 Me he equivocado, quería hacer un paquete 69 00:03:20,780 --> 00:03:23,099 Paquete 70 00:03:23,099 --> 00:03:31,680 Vale, si hacemos ahora ya 71 00:03:31,680 --> 00:03:33,659 Vamos a hacer una interfaz 72 00:03:33,659 --> 00:03:35,500 Que no deja de ser 73 00:03:35,500 --> 00:03:39,259 Pues cualquier cosa 74 00:03:39,259 --> 00:03:40,080 Yo que sé 75 00:03:40,080 --> 00:03:47,860 vale, una interfaz 76 00:03:47,860 --> 00:03:49,379 simplemente en lugar de class 77 00:03:49,379 --> 00:03:51,780 tiene interfaz delante, nada más 78 00:03:51,780 --> 00:03:53,740 vale, entonces 79 00:03:53,740 --> 00:03:55,539 está pensada, como decimos, para tener 80 00:03:55,539 --> 00:03:56,960 métodos vacíos y que luego 81 00:03:56,960 --> 00:03:59,560 nosotros cambiemos la clase que tiene debajo 82 00:03:59,560 --> 00:04:01,580 en función de nuestros intereses, pero no cambia 83 00:04:01,580 --> 00:04:03,699 el nombre del método, luego la clase 84 00:04:03,699 --> 00:04:05,300 el programa principal 85 00:04:05,300 --> 00:04:07,580 el principal, la aplicación principal que llama 86 00:04:07,580 --> 00:04:09,620 los métodos, esa no cambia 87 00:04:09,620 --> 00:04:11,580 aunque cambie mi implementación 88 00:04:12,180 --> 00:04:13,580 bueno, pues 89 00:04:13,580 --> 00:04:22,490 pues por ejemplo 90 00:04:22,490 --> 00:04:29,889 este es un método de una interfaz 91 00:04:29,889 --> 00:04:32,730 sin definir, recordad que por defecto son públicos 92 00:04:32,730 --> 00:04:35,449 con lo cual no hay que poner el public porque por defecto son todos públicos 93 00:04:35,449 --> 00:04:37,750 porque la interfaz precisamente está pensada 94 00:04:37,750 --> 00:04:40,449 para homogeneizar 95 00:04:40,449 --> 00:04:43,730 la distribución de código 96 00:04:43,730 --> 00:04:46,449 entonces cuando tú distribuyes código lo distribuyes en paquetes 97 00:04:46,449 --> 00:04:48,589 entonces tú importas los paquetes 98 00:04:48,589 --> 00:04:51,730 Tu código principal no va a estar en el mismo paquete 99 00:04:51,730 --> 00:04:53,709 Entonces vas a necesitar que sea público 100 00:04:53,709 --> 00:04:54,470 Es que no hay otra 101 00:04:54,470 --> 00:04:57,589 Por defecto, por el uso que se le da a las interfaces 102 00:04:57,589 --> 00:04:59,050 Es que tienen que ser públicos 103 00:04:59,050 --> 00:05:01,009 Si no, no tendrían ningún uso 104 00:05:01,009 --> 00:05:02,529 Si yo me descargo un paquete de alguien 105 00:05:02,529 --> 00:05:04,730 Y los métodos que tienen dentro no son públicos, ¿para qué me vale? 106 00:05:05,449 --> 00:05:07,110 Entonces no hace falta ni que lo pongamos 107 00:05:07,110 --> 00:05:09,209 En ese caso es el único caso en el cual 108 00:05:09,209 --> 00:05:11,769 No hace falta poner el public 109 00:05:11,769 --> 00:05:12,110 Vale 110 00:05:12,110 --> 00:05:15,029 Bueno, pues entonces ya sabéis que esta 111 00:05:15,029 --> 00:05:17,550 Interfase se implementa 112 00:05:17,550 --> 00:05:19,689 Y quien implemente la interfaz 113 00:05:19,689 --> 00:05:21,949 Tiene que dar cuerpo obligatoriamente 114 00:05:21,949 --> 00:05:22,550 A ese método 115 00:05:22,550 --> 00:05:25,829 La interfaz puede tener 116 00:05:25,829 --> 00:05:27,230 Todos los métodos que le den la gana 117 00:05:27,230 --> 00:05:29,850 Pero también puede tener métodos 118 00:05:29,850 --> 00:05:32,029 Con implementaciones por defecto 119 00:05:32,029 --> 00:05:32,449 ¿Vale? 120 00:05:33,829 --> 00:05:35,910 Por ejemplo, puede tener un método 121 00:05:35,910 --> 00:05:42,370 Sí, pero tú lo puedes sobreescribir 122 00:05:42,370 --> 00:05:43,790 Si quieres, pero eso no te hace falta 123 00:05:43,790 --> 00:05:54,250 ¿Vale? 124 00:05:56,250 --> 00:05:58,009 Y métodos con implementaciones 125 00:05:58,009 --> 00:05:59,389 Por defecto puede tener muchos 126 00:05:59,389 --> 00:06:02,089 igual que métodos sin implementación puede tener muchos 127 00:06:02,089 --> 00:06:03,990 también una interfaz 128 00:06:03,990 --> 00:06:05,970 puede ofrecer y ya de paso 129 00:06:05,970 --> 00:06:08,050 pues nos ofrece comportamiento 130 00:06:08,050 --> 00:06:09,629 a lo mejor útil para cosas, puede ofrecer 131 00:06:09,629 --> 00:06:11,430 métodos static, también 132 00:06:11,430 --> 00:06:15,639 vale, una interfaz puede ofrecer 133 00:06:15,639 --> 00:06:17,339 un método static, vale 134 00:06:17,339 --> 00:06:26,189 no, no pasa nada 135 00:06:26,189 --> 00:06:27,269 pero vamos, no hace falta 136 00:06:27,269 --> 00:06:35,920 vale, entonces 137 00:06:35,920 --> 00:06:38,120 los métodos static 138 00:06:38,120 --> 00:06:40,620 pues nos permiten ser llamados a partir 139 00:06:40,620 --> 00:06:42,180 de la implementación directamente 140 00:06:42,180 --> 00:06:46,420 Entonces, bueno, nos ofrecen a lo mejor un código interesante 141 00:06:46,420 --> 00:06:49,259 Pero no es un código de instancia, lógicamente 142 00:06:49,259 --> 00:06:50,519 No es un código de objeto 143 00:06:50,519 --> 00:06:54,259 Los métodos static, por tanto 144 00:06:54,259 --> 00:06:56,779 Al no poder depender del objeto 145 00:06:56,779 --> 00:06:58,420 Porque son static por definición 146 00:06:58,420 --> 00:07:01,459 Los definimos directamente en la interfaz 147 00:07:01,459 --> 00:07:03,800 ¿Vale? Los definimos directamente aquí 148 00:07:03,800 --> 00:07:07,519 No tiene sentido sobreescribirlos en la instancia 149 00:07:07,519 --> 00:07:11,339 Porque sobreescribirlos en la instancia que lo implementa 150 00:07:11,339 --> 00:07:13,500 perdón, sobreescribirlos en la clase 151 00:07:13,500 --> 00:07:15,399 que lo implementa, solo tendría 152 00:07:15,399 --> 00:07:17,319 sentido si ese método dependiera del 153 00:07:17,319 --> 00:07:19,319 objeto, solo tendría sentido sobreescribirlo 154 00:07:19,319 --> 00:07:20,879 ahí si va a depender del objeto 155 00:07:20,879 --> 00:07:23,339 pero como es estático, no va a 156 00:07:23,339 --> 00:07:24,959 depender del objeto, es imposible 157 00:07:24,959 --> 00:07:27,720 pues entonces lo escribimos 158 00:07:27,720 --> 00:07:28,839 en la interfaz 159 00:07:28,839 --> 00:07:31,199 ¿vale? entonces, bueno, en función 160 00:07:31,199 --> 00:07:32,720 de nuestro diseño de código, pues 161 00:07:32,720 --> 00:07:34,680 si nos interesa ofrecer aquí 162 00:07:34,680 --> 00:07:37,220 algún código estático que no necesite que haya 163 00:07:37,220 --> 00:07:38,819 instancias, lo ofrecemos y ya está 164 00:07:38,819 --> 00:07:41,079 pues esto es una interfaz más o menos 165 00:07:41,079 --> 00:07:43,019 en general y ya sabemos las particularidades 166 00:07:43,019 --> 00:07:45,439 de su implementación, si alguien implementa 167 00:07:45,439 --> 00:07:46,720 esto lo tiene que 168 00:07:46,720 --> 00:07:47,879 implementar 169 00:07:47,879 --> 00:07:49,259 no puedo hacerlo 170 00:07:49,259 --> 00:07:51,860 no tengo que llamar a un objeto 171 00:07:51,860 --> 00:07:53,800 no, si, puedes poner saludar 172 00:07:53,800 --> 00:07:55,519 sí 173 00:07:55,519 --> 00:07:58,879 vale 174 00:07:58,879 --> 00:08:00,180 ahora 175 00:08:00,180 --> 00:08:05,410 puede ocurrir que una interfaz 176 00:08:05,410 --> 00:08:07,629 tenga solamente 177 00:08:07,629 --> 00:08:09,689 un método abstracto 178 00:08:09,689 --> 00:08:11,209 un método por definir 179 00:08:11,209 --> 00:08:14,649 entonces si una interfaz tiene solo 180 00:08:14,649 --> 00:08:16,370 un método por definir 181 00:08:16,370 --> 00:08:18,629 en lugar de muchos, es lo que se llama 182 00:08:18,629 --> 00:08:20,029 una interfaz funcional 183 00:08:20,029 --> 00:08:21,790 ¿vale? 184 00:08:22,110 --> 00:08:24,509 esta lo sería, porque tiene solo 185 00:08:24,509 --> 00:08:26,149 un método vacío, abstracto 186 00:08:26,149 --> 00:08:28,709 puede tener 200.000 default y 200.000 static 187 00:08:28,709 --> 00:08:30,670 pero solo tiene un abstracto 188 00:08:30,670 --> 00:08:31,870 entonces 189 00:08:31,870 --> 00:08:34,889 esto se conoce como una interfaz funcional 190 00:08:34,889 --> 00:08:36,549 ya, se le da ese nombre 191 00:08:36,549 --> 00:08:37,149 sin más 192 00:08:37,149 --> 00:08:39,190 ¿por qué? 193 00:08:39,190 --> 00:08:50,730 Pues porque ahora los objetos de esta interfaz funcional se les ve, se les interpreta como comportamientos de este único método. 194 00:08:51,509 --> 00:08:57,549 Entonces, cuando uno instancia, vamos a instanciar ahora una clase de esta interfaz funcional, 195 00:08:58,269 --> 00:09:03,429 tiene que ofrecer un único comportamiento que es el del único método abstracto. 196 00:09:03,429 --> 00:09:08,149 Entonces, una interfaz funcional se asocia a un método. 197 00:09:09,450 --> 00:09:14,190 Luego ese es el primer salto que damos para entender que los métodos pueden ser datos. 198 00:09:15,049 --> 00:09:16,549 Un método puede ser un dato. 199 00:09:17,169 --> 00:09:18,750 ¿Por qué un método puede ser un dato? 200 00:09:19,230 --> 00:09:23,929 Porque un método puede ser un objeto que implementa una interfaz funcional. 201 00:09:24,350 --> 00:09:28,769 Y un objeto que implementa una interfaz funcional tiene un método dentro, solo uno. 202 00:09:28,970 --> 00:09:31,730 Pues ahí está el dato, en ese método. 203 00:09:31,730 --> 00:09:33,710 Pero bueno, por partes 204 00:09:33,710 --> 00:09:35,809 Esto sería una interfaz funcional 205 00:09:35,809 --> 00:09:38,549 Cuando identificamos que tenemos una interfaz funcional 206 00:09:38,549 --> 00:09:40,610 Es recomendable 207 00:09:40,610 --> 00:09:41,809 Anotarla 208 00:09:41,809 --> 00:09:48,679 Anotarla con la 209 00:09:48,679 --> 00:09:50,580 Anotación funcional interface 210 00:09:50,580 --> 00:09:51,980 Para indicar que es una interfaz funcional 211 00:09:51,980 --> 00:09:53,679 ¿Obligatorio? 212 00:09:54,120 --> 00:09:55,320 No es obligatorio 213 00:09:55,320 --> 00:09:57,600 ¿Recomendable? Sí 214 00:09:57,600 --> 00:10:00,000 ¿Recomendable por qué? 215 00:10:01,500 --> 00:10:02,480 Porque ofrece 216 00:10:02,480 --> 00:10:04,480 Una validación ya en tiempo de compilación 217 00:10:04,480 --> 00:10:05,559 Esto es como el override 218 00:10:05,559 --> 00:10:07,159 cuando sobreescribimos un método 219 00:10:07,159 --> 00:10:09,960 recordad cuando heredamos o implementamos 220 00:10:09,960 --> 00:10:11,240 y sobreescribimos un método 221 00:10:11,240 --> 00:10:13,519 podíamos poner el override o no ponerlo 222 00:10:13,519 --> 00:10:15,820 no es obligatorio, pero si ponemos 223 00:10:15,820 --> 00:10:17,720 el override automáticamente se hace 224 00:10:17,720 --> 00:10:19,419 una validación en tiempo de compilación 225 00:10:19,419 --> 00:10:21,539 que es, a ver, este método que tienes 226 00:10:21,539 --> 00:10:23,600 debajo del override, ¿realmente 227 00:10:23,600 --> 00:10:25,340 su cabecera es idéntica 228 00:10:25,340 --> 00:10:27,440 que uno de la superclase? 229 00:10:28,659 --> 00:10:29,899 porque si no lo es 230 00:10:29,899 --> 00:10:30,720 te voy a dar un error 231 00:10:30,720 --> 00:10:33,539 ¿vale? entonces ya te ofrece una validación en tiempo 232 00:10:33,539 --> 00:10:35,500 de compilación, que está muy bien porque tú 233 00:10:35,500 --> 00:10:39,000 O a lo mejor crees que estás sobrescribiendo un método de la superclase 234 00:10:39,000 --> 00:10:41,240 y te has equivocado poniendo un carácter de más. 235 00:10:41,700 --> 00:10:43,980 Si no pones el override, no te enteras. 236 00:10:44,440 --> 00:10:46,860 No te enteras, has puesto el carácter de más, no has puesto el override, 237 00:10:46,960 --> 00:10:48,279 el tipo de combinación, no te enteras. 238 00:10:48,679 --> 00:10:52,299 Cuando luego tu programa llame al método de la superclase, 239 00:10:52,440 --> 00:10:54,519 al que va a llamar al de la superclase, 240 00:10:54,840 --> 00:10:56,820 dices, pero si esto no hace nada, no hace nada, no hace nada. 241 00:10:56,960 --> 00:10:59,460 Claro que no hace nada porque no lo has sobrescrito, 242 00:11:00,000 --> 00:11:01,399 creyendo que si lo has hecho, no lo has hecho. 243 00:11:02,179 --> 00:11:04,179 Pues esa es la ventaja de las anotaciones. 244 00:11:04,179 --> 00:11:11,019 no siempre son obligatorias, ofrecen información, a veces información en tiempo de ejecución 245 00:11:11,019 --> 00:11:16,360 y otras validación en tiempo de compilación como esta. Y esta validación es estupenda 246 00:11:16,360 --> 00:11:21,039 porque si yo me creo que he hecho una interfaz funcional y que luego voy a poder instanciar 247 00:11:21,039 --> 00:11:27,600 con una función, como veremos ahora, etc. Y resulta que no me he dado cuenta porque 248 00:11:27,600 --> 00:11:32,460 he hecho un copia y pega de otra que tengo por ahí de hace dos años. He hecho un copia 249 00:11:32,460 --> 00:11:34,059 y pega y aquí tengo yo 250 00:11:34,059 --> 00:11:36,539 otro método abstracto 251 00:11:36,539 --> 00:11:38,720 entonces automáticamente 252 00:11:38,720 --> 00:11:40,360 si yo he puesto 253 00:11:40,360 --> 00:11:42,440 la anotación, me salta el error 254 00:11:42,440 --> 00:11:44,639 ¿vale? porque solo puede tener una 255 00:11:44,639 --> 00:11:48,360 pues no lo he mirado nunca, la verdad 256 00:11:48,360 --> 00:11:50,840 anotación inválida 257 00:11:50,840 --> 00:11:52,500 no es una interfaz funcional 258 00:11:52,500 --> 00:11:53,200 ¿vale? 259 00:11:54,440 --> 00:11:56,600 entonces ya no solo por esa validación 260 00:11:56,600 --> 00:11:58,460 en tiempo de compilación, sino porque 261 00:11:58,460 --> 00:12:00,639 todo lo claro que pueda ser un código 262 00:12:00,639 --> 00:12:02,500 mejor, cuanto más legible sea mejor 263 00:12:02,500 --> 00:12:04,539 y las anotaciones, cuando tú ves 264 00:12:04,539 --> 00:12:06,659 el código de alguien, las anotaciones te sitúan 265 00:12:06,659 --> 00:12:08,059 en el objetivo 266 00:12:08,059 --> 00:12:09,480 de esas interfaces 267 00:12:09,480 --> 00:12:11,460 vale, pues ya está 268 00:12:11,460 --> 00:12:15,950 entonces 269 00:12:15,950 --> 00:12:19,570 esta interfaz funcional, si yo ahora la quiero usar 270 00:12:19,570 --> 00:12:23,330 por ejemplo, tengo un 271 00:12:23,330 --> 00:12:24,529 programa por aquí 272 00:12:24,529 --> 00:12:38,830 ay, se me ha olvidado poner el 273 00:12:38,830 --> 00:12:55,000 vale, pues 274 00:12:55,000 --> 00:12:55,580 entonces 275 00:12:55,580 --> 00:12:59,039 yo puedo tener un método 276 00:12:59,039 --> 00:13:01,580 que en lugar de recibir un dato para hacer 277 00:13:01,580 --> 00:13:03,500 cosas, reciba 278 00:13:03,500 --> 00:13:05,759 un comportamiento, una acción 279 00:13:05,759 --> 00:13:07,519 que es la idea 280 00:13:07,519 --> 00:13:09,500 de la programación funcional, por ejemplo 281 00:13:09,500 --> 00:13:10,919 vamos a hacer aquí un método 282 00:13:10,919 --> 00:13:13,399 estático para que lo podamos llamar 283 00:13:13,399 --> 00:13:20,120 desde main, haz algo 284 00:13:20,120 --> 00:13:21,879 y ahora 285 00:13:21,879 --> 00:13:23,179 a este haz algo 286 00:13:23,179 --> 00:13:25,399 le voy a pasar 287 00:13:25,399 --> 00:13:28,000 una instancia de mi interfaz funcional 288 00:13:28,000 --> 00:13:30,019 anterior, entonces la 289 00:13:30,019 --> 00:13:32,100 idea, lo que pasa es que luego con los 290 00:13:32,100 --> 00:13:40,279 lo veremos más claro, la idea es que yo a esta función, a este método, no le estoy pasando, como siempre, 291 00:13:40,779 --> 00:13:46,820 dato, un dato para que trabaje, un nombre, una cadena de cosas, no le estoy pasando un dato, 292 00:13:47,360 --> 00:13:53,019 le estoy pasando una acción, le estoy pasando una acción. Pues, ¿cuál puede ser mi manera de pasarle una acción? 293 00:13:53,220 --> 00:14:00,720 Le tendré que pasar una instancia de la interfaz anterior, porque esa instancia tendrá que haber 294 00:14:00,720 --> 00:14:02,580 sobrescrito el método saludar 295 00:14:02,580 --> 00:14:04,779 y, por tanto, le estoy pasando 296 00:14:04,779 --> 00:14:07,100 la acción 297 00:14:07,100 --> 00:14:07,779 de saludar. 298 00:14:08,779 --> 00:14:10,740 Entonces, yo aquí le 299 00:14:10,740 --> 00:14:13,179 ¿cómo se llamaba mi interfaz? 300 00:14:13,360 --> 00:14:24,090 Saludar. Vale. 301 00:14:24,450 --> 00:14:25,789 Pues, entonces, a este método 302 00:14:25,789 --> 00:14:28,129 le voy a pasar, en realidad, lo que le estoy pasando es un 303 00:14:28,129 --> 00:14:30,289 comportamiento. Y ese comportamiento 304 00:14:30,289 --> 00:14:33,620 ¿dónde va a estar? Aquí. 305 00:14:34,200 --> 00:14:35,840 Pero, claro, le tendré que pasar a una instancia. 306 00:14:35,960 --> 00:14:37,740 Le tengo que pasar a una instancia porque solamente 307 00:14:37,740 --> 00:14:39,860 yo aquí tengo que pasar siempre 308 00:14:39,860 --> 00:14:43,000 como parámetro, siempre paso cosas que existan 309 00:14:43,000 --> 00:14:44,919 lógicamente, objetos o datos 310 00:14:44,919 --> 00:14:46,440 primitivos, pero algo que exista 311 00:14:46,440 --> 00:14:48,120 algo que sea instanciable 312 00:14:48,120 --> 00:14:50,679 yo no puedo pasar por parámetro algo que no sea 313 00:14:50,679 --> 00:14:52,759 instanciable, entonces aquí siempre 314 00:14:52,759 --> 00:14:54,019 tengo que pasar una instancia 315 00:14:54,019 --> 00:14:56,960 no puede instanciar saludar, como bien sabemos 316 00:14:56,960 --> 00:14:58,980 pues entonces toca hacer una clase 317 00:14:58,980 --> 00:15:00,259 que implemente saludar 318 00:15:00,259 --> 00:15:01,539 entonces 319 00:15:01,539 --> 00:15:07,860 ahora ya 320 00:15:07,860 --> 00:15:09,299 nos podemos hacer, por ejemplo 321 00:15:09,299 --> 00:15:11,279 saludar1 322 00:15:11,279 --> 00:15:17,509 Venga, para que el 1 323 00:15:17,509 --> 00:15:18,450 Queda muy feo 324 00:15:18,450 --> 00:15:19,769 Saludar bien 325 00:15:19,769 --> 00:15:22,649 Pues en saludar bien 326 00:15:22,649 --> 00:15:25,129 Yo quiero que esto 327 00:15:25,129 --> 00:15:26,490 Implemente 328 00:15:26,490 --> 00:15:29,129 Mi interfaz funcional anterior 329 00:15:29,129 --> 00:15:30,889 Saludar 330 00:15:30,889 --> 00:15:34,370 Desde el momento en que 331 00:15:34,370 --> 00:15:36,909 Implementa mi interfaz 332 00:15:36,909 --> 00:15:37,750 Anterior 333 00:15:37,750 --> 00:15:41,509 Tengo que definir este comportamiento 334 00:15:41,509 --> 00:15:43,490 Y solo este, porque no hay más métodos abstractos 335 00:15:43,490 --> 00:15:44,870 Pues por ejemplo 336 00:15:44,870 --> 00:15:46,289 Yo aquí podría poner 337 00:15:46,289 --> 00:16:01,580 y puedo tener todas las implementaciones 338 00:16:01,580 --> 00:16:02,580 que yo quiera 339 00:16:02,580 --> 00:16:04,879 vale 340 00:16:04,879 --> 00:16:07,639 mi aplicación puede saludar de mil maneras 341 00:16:07,639 --> 00:16:26,730 implement 342 00:16:26,730 --> 00:16:28,389 saludar 343 00:16:28,389 --> 00:16:31,409 vale, al implementar saludar 344 00:16:31,409 --> 00:16:47,690 vale, entonces 345 00:16:47,690 --> 00:16:49,830 ahora ya 346 00:16:49,830 --> 00:16:53,909 este método, en lugar de llamarlo 347 00:16:53,909 --> 00:16:55,649 haz algo, vamos a llamarlo saludar 348 00:16:55,649 --> 00:16:59,580 saludar, vale 349 00:16:59,580 --> 00:17:03,639 pues a este método 350 00:17:03,639 --> 00:17:05,859 Yo le tengo que pasar 351 00:17:05,859 --> 00:17:07,519 Una instancia de este de aquí 352 00:17:07,519 --> 00:17:09,099 Y en función de la instancia que le pase 353 00:17:09,099 --> 00:17:10,539 Saludar hace una cosa u otra 354 00:17:10,539 --> 00:17:11,880 Entonces 355 00:17:11,880 --> 00:17:17,980 Bueno, primero tengo que hacer el método 356 00:17:17,980 --> 00:17:19,579 Ese punto 357 00:17:19,579 --> 00:17:25,920 Este, ¿vale? 358 00:17:27,700 --> 00:17:28,140 Saludar 359 00:17:28,140 --> 00:17:31,440 Ah, bueno, espérate 360 00:17:31,440 --> 00:17:33,759 Porque el nombre pasado 361 00:17:33,759 --> 00:17:35,200 Se recibía un parámetro 362 00:17:35,200 --> 00:17:37,440 Cómo se encuentra, vamos a ponerle 363 00:17:37,440 --> 00:17:39,119 Para que te diga 364 00:17:39,119 --> 00:17:39,779 Quién 365 00:17:39,779 --> 00:17:42,140 Voy a que le pasa un parámetro 366 00:17:42,140 --> 00:17:51,819 Entra, nombre 367 00:17:51,819 --> 00:17:53,920 Concatenamos 368 00:17:55,019 --> 00:17:57,880 Con la interrogación 369 00:17:57,880 --> 00:17:58,380 Vale 370 00:17:58,380 --> 00:18:01,859 Porque pasarle el parámetro si no lo voy a usar 371 00:18:01,859 --> 00:18:03,539 Vale 372 00:18:03,539 --> 00:18:07,559 Cómo se encuentra 373 00:18:07,559 --> 00:18:11,740 Y 374 00:18:11,740 --> 00:18:14,339 Saludar mal 375 00:18:14,339 --> 00:18:29,519 Este 376 00:18:29,519 --> 00:18:32,259 Y este de aquí 377 00:18:32,259 --> 00:18:37,440 Sí, pero bueno 378 00:18:37,440 --> 00:18:39,519 Como tiene que implementarlo tal cual 379 00:18:39,519 --> 00:18:41,319 Podríamos pasar de él, pero bueno 380 00:18:41,319 --> 00:18:44,299 Su nombrecito 381 00:18:44,299 --> 00:18:44,980 Venga 382 00:18:44,980 --> 00:18:48,519 Entonces, ahora voy a saludar 383 00:18:48,519 --> 00:18:49,759 ¿Vale? 384 00:18:50,079 --> 00:18:51,480 Como estamos usando un parámetro 385 00:18:51,480 --> 00:18:53,980 Pues vamos a pasar aquí a quien queremos saludar 386 00:18:53,980 --> 00:18:56,359 Y ahora yo 387 00:18:56,359 --> 00:19:01,740 esta podría ser la implementación de mi método 388 00:19:01,740 --> 00:19:03,000 entonces ahora este método 389 00:19:03,000 --> 00:19:05,319 tiene dos datos 390 00:19:05,319 --> 00:19:08,220 un dato es el nombre de quien voy a saludar 391 00:19:08,220 --> 00:19:09,819 ahí conceptualmente no cambia nada 392 00:19:09,819 --> 00:19:10,519 es un dato 393 00:19:10,519 --> 00:19:13,480 como los que conocemos, un nombre, un número 394 00:19:13,480 --> 00:19:14,140 lo que sea 395 00:19:14,140 --> 00:19:17,220 y el segundo dato o parámetro que tiene 396 00:19:17,220 --> 00:19:19,740 es una manera de saludar 397 00:19:19,740 --> 00:19:21,319 es decir, un comportamiento 398 00:19:21,319 --> 00:19:23,740 este método ahora depende 399 00:19:23,740 --> 00:19:25,619 de una forma 400 00:19:25,619 --> 00:19:27,460 de actuar y de un dato 401 00:19:27,460 --> 00:19:28,599 ¿vale? 402 00:19:28,700 --> 00:19:35,039 Entonces, una interfaz funcional es una forma de actuar que, de nuevo, repetimos, se puede pasar como parámetro. 403 00:19:37,940 --> 00:19:40,220 Claro, de hecho, ahora podemos saludar de muchas maneras. 404 00:19:41,119 --> 00:19:42,980 Le vamos a que nos diga cómo se llama. 405 00:19:52,609 --> 00:19:53,009 Vale. 406 00:20:27,650 --> 00:20:28,750 Y ahora ya. 407 00:20:37,069 --> 00:20:40,190 Ahora, cuando llamemos a saludar, ¿vale? 408 00:20:40,190 --> 00:20:42,430 cuando llamemos a saludar 409 00:20:42,430 --> 00:20:44,630 vamos a saludar bien y saludar mal 410 00:20:44,630 --> 00:20:45,410 a este tío 411 00:20:45,410 --> 00:20:48,849 entonces, este tío se llama nombre 412 00:20:48,849 --> 00:21:00,660 ¿vale? 413 00:21:02,279 --> 00:21:02,880 entonces 414 00:21:02,880 --> 00:21:04,680 en estas dos llamadas 415 00:21:04,680 --> 00:21:06,019 el dato lo he pasado 416 00:21:06,019 --> 00:21:08,920 lo que me falta pasar es la forma de saludar 417 00:21:08,920 --> 00:21:10,599 es decir, el comportamiento 418 00:21:10,599 --> 00:21:12,619 el comportamiento es 419 00:21:12,619 --> 00:21:15,259 la instancia correspondiente 420 00:21:15,259 --> 00:21:17,059 de esa interfaz 421 00:21:17,059 --> 00:21:18,680 funcional que me interesa 422 00:21:18,680 --> 00:21:19,839 entonces 423 00:21:19,839 --> 00:21:27,079 así 424 00:21:27,079 --> 00:21:30,119 le paso el primer comportamiento 425 00:21:30,119 --> 00:21:31,819 porque le paso una instancia de esa 426 00:21:31,819 --> 00:21:32,779 interfaz funcional 427 00:21:32,779 --> 00:21:38,440 y así le paso el segundo comportamiento 428 00:21:38,440 --> 00:21:40,079 pues estoy pasando dos 429 00:21:40,079 --> 00:21:42,059 cosas, la forma 430 00:21:42,059 --> 00:21:43,680 de saludar que es 431 00:21:43,680 --> 00:21:44,680 la instancia 432 00:21:44,680 --> 00:21:47,880 de la interfaz 433 00:21:47,880 --> 00:21:49,960 funcional y ya un dato porque en este ejemplo 434 00:21:49,960 --> 00:21:51,740 en concreto además necesita un dato 435 00:21:51,740 --> 00:22:06,940 vale 436 00:22:06,940 --> 00:22:11,630 entonces 437 00:22:11,630 --> 00:22:14,150 es el mismo código 438 00:22:14,150 --> 00:22:16,269 es llamada 439 00:22:16,269 --> 00:22:18,890 saludar 440 00:22:18,890 --> 00:22:19,730 el mismo 441 00:22:19,730 --> 00:22:22,430 lo que cambia es lo que yo le paso aquí 442 00:22:22,430 --> 00:22:24,009 ¿vale? 443 00:22:45,900 --> 00:22:46,259 vale 444 00:22:46,259 --> 00:22:48,880 ¿hasta aquí está claro? 445 00:22:48,880 --> 00:22:50,920 está claro 446 00:22:50,920 --> 00:22:51,200 ¿verdad? 447 00:22:52,319 --> 00:22:55,000 bueno pues efectivamente se ve o se vislumbra 448 00:22:55,000 --> 00:22:56,859 que esto es bastante útil 449 00:22:56,859 --> 00:22:58,440 operativo, da mucha flexibilidad 450 00:22:58,440 --> 00:23:01,220 y sobre todo me permite unos esquemas de diseño 451 00:23:01,220 --> 00:23:02,880 muchísimo más 452 00:23:02,880 --> 00:23:04,619 con muchísima más riqueza 453 00:23:04,619 --> 00:23:07,099 aquí lo único que ha sido un poquito 454 00:23:07,099 --> 00:23:09,279 farragoso es el paso 455 00:23:09,279 --> 00:23:11,079 de tener que hacer 456 00:23:11,079 --> 00:23:13,500 la clase 457 00:23:13,500 --> 00:23:14,599 que implementa esta 458 00:23:14,599 --> 00:23:17,440 porque tengo que hacer toda una clase entera 459 00:23:17,440 --> 00:23:19,220 solamente 460 00:23:19,779 --> 00:23:21,420 para esta línea 461 00:23:21,420 --> 00:23:23,539 y toda esta clase entera 462 00:23:23,539 --> 00:23:24,660 solamente 463 00:23:24,660 --> 00:23:26,339 para esta línea 464 00:23:26,339 --> 00:23:29,420 entonces lo que se nos ha hecho un poquito pesado 465 00:23:29,420 --> 00:23:32,200 es tener que hacer una clase entera 466 00:23:32,200 --> 00:23:33,700 que implemente la interfaz 467 00:23:33,700 --> 00:23:35,539 solo para ofrecer este comportamiento. 468 00:23:37,259 --> 00:23:38,619 No pasa nada, se puede hacer. 469 00:23:38,740 --> 00:23:40,660 Lo que pasa es que Java te ofrece 470 00:23:40,660 --> 00:23:42,160 una manera más dinámica 471 00:23:42,160 --> 00:23:46,140 de crear estos comportamientos 472 00:23:46,140 --> 00:23:48,359 más allá de hacer una clase 473 00:23:48,359 --> 00:23:49,500 que lo implemente 474 00:23:49,500 --> 00:23:52,319 y meter ese comportamiento dentro de esto de aquí. 475 00:23:53,319 --> 00:23:55,640 Que es a través de las funciones. 476 00:23:56,500 --> 00:24:03,259 ¿No suena bien? 477 00:24:05,019 --> 00:24:09,880 esto no es nada 478 00:24:09,880 --> 00:24:10,400 hombre a ver 479 00:24:10,400 --> 00:24:11,619 todo es mucho 480 00:24:11,619 --> 00:24:12,940 en función del grado de profundidad 481 00:24:12,940 --> 00:24:13,859 que se quiera meter uno 482 00:24:13,859 --> 00:24:16,259 para el andar por casa 483 00:24:16,259 --> 00:24:17,640 que andamos nosotros 484 00:24:17,640 --> 00:24:18,980 para el andar por casa 485 00:24:18,980 --> 00:24:20,200 esto es muy sencillo 486 00:24:20,200 --> 00:24:21,740 para meterse en profundidades 487 00:24:21,740 --> 00:24:22,599 que es lo que haréis 488 00:24:22,599 --> 00:24:23,920 cuando te pongan a ti 489 00:24:23,920 --> 00:24:25,400 a trabajar en una cosa concreta 490 00:24:25,400 --> 00:24:26,059 sobre esto 491 00:24:26,059 --> 00:24:27,720 entonces te metes en profundidades 492 00:24:27,720 --> 00:24:29,839 pero tienes el hilo del que tirar 493 00:24:29,839 --> 00:24:31,079 que eso es lo que se supone 494 00:24:31,079 --> 00:24:32,160 que tenéis que coger en el ciclo 495 00:24:32,160 --> 00:24:33,799 el hilo del cual tirar 496 00:24:33,799 --> 00:24:36,160 para te pongan donde te pongan, te dan un bofetón 497 00:24:36,160 --> 00:24:37,900 y te vas para allá, no pasa nada 498 00:24:37,900 --> 00:24:39,900 sé dónde tirar para sobrevivir, me dan otro 499 00:24:39,900 --> 00:24:41,539 bofetón y voy para acá, sé dónde tirar 500 00:24:41,539 --> 00:24:44,039 no estoy en Alvis por la vida 501 00:24:44,039 --> 00:24:45,180 y vale 502 00:24:45,180 --> 00:24:48,099 porque ChatGPT es maravilloso 503 00:24:48,099 --> 00:24:49,799 y útil para el que está 504 00:24:49,799 --> 00:24:51,940 situado, entonces para el que 505 00:24:51,940 --> 00:24:53,180 está situado en el mundo 506 00:24:53,180 --> 00:24:55,339 es maravilloso 507 00:24:55,339 --> 00:24:57,440 pero para el que no está situado 508 00:24:57,440 --> 00:24:59,579 es un desastre porque él 509 00:24:59,579 --> 00:25:01,779 pues no, si tú no le haces las preguntas 510 00:25:01,779 --> 00:25:03,519 correctas jamás vas a obtener las preguntas 511 00:25:03,519 --> 00:25:05,519 correctas, las respuestas correctas 512 00:25:05,519 --> 00:25:07,640 lógicamente, entonces hay que 513 00:25:07,640 --> 00:25:09,720 situarse, ¿qué es lo que hacemos aquí? 514 00:25:09,819 --> 00:25:11,619 pues un poco tocar un poco todas las 515 00:25:11,619 --> 00:25:13,640 cosas para saber de dónde tirar 516 00:25:13,640 --> 00:25:15,500 bueno, pues entonces, ¿cómo podemos 517 00:25:15,500 --> 00:25:17,859 usar una función lambda 518 00:25:17,859 --> 00:25:19,660 para 519 00:25:19,660 --> 00:25:21,559 dar una 520 00:25:21,559 --> 00:25:23,920 instancia a una 521 00:25:23,920 --> 00:25:25,640 interfaz 522 00:25:25,640 --> 00:25:27,759 funcional? ¿qué es lo que queríamos 523 00:25:27,759 --> 00:25:29,799 aquí? instanciar una interfaz funcional 524 00:25:29,799 --> 00:25:31,579 porque aquí hemos 525 00:25:31,579 --> 00:25:32,440 necesitado 526 00:25:32,440 --> 00:25:35,660 instanciar 527 00:25:35,660 --> 00:25:37,559 una interfaz funcional para 528 00:25:37,559 --> 00:25:39,839 aquí hemos 529 00:25:39,839 --> 00:25:42,000 necesitado instanciar una interfaz 530 00:25:42,000 --> 00:25:43,700 funcional para pasar el comportamiento 531 00:25:43,700 --> 00:25:43,880 ¿no? 532 00:25:45,299 --> 00:25:47,640 que el rollo ha sido, repito, tener que crear esta clase 533 00:25:47,640 --> 00:25:49,500 el nudo rollo, pues no hace falta 534 00:25:49,500 --> 00:25:51,200 en realidad crear esa clase intermedia 535 00:25:51,200 --> 00:25:52,599 es decir 536 00:25:52,599 --> 00:25:54,160 ¿eh? 537 00:25:54,160 --> 00:25:56,039 no hace falta 538 00:25:56,039 --> 00:25:58,319 por ejemplo 539 00:25:58,319 --> 00:26:00,000 vamos a hacerlo 540 00:26:00,000 --> 00:26:05,470 Yo quiero crear una instancia 541 00:26:05,470 --> 00:26:06,230 De este de aquí 542 00:26:06,230 --> 00:26:09,150 Tal y como lo hemos hecho ahora 543 00:26:09,150 --> 00:26:10,710 Por ejemplo tendría aquí 544 00:26:10,710 --> 00:26:12,369 Saludar S1 545 00:26:12,369 --> 00:26:16,869 Haría esto 546 00:26:16,869 --> 00:26:21,400 Vamos a hacerlo en dos líneas 547 00:26:21,400 --> 00:26:23,079 Para que se vea mejor la diferencia 548 00:26:23,079 --> 00:26:26,259 Y saludar S2 549 00:26:26,259 --> 00:26:27,700 Saludar mal 550 00:26:27,700 --> 00:26:30,319 Vale, esto es lo que hemos hecho 551 00:26:30,319 --> 00:26:32,339 ¿No? Separándolo en dos líneas 552 00:26:32,339 --> 00:26:36,750 S1, S2 553 00:26:36,750 --> 00:26:37,089 Vale 554 00:26:37,089 --> 00:26:40,630 bueno pues como puedo yo hacer esto 555 00:26:40,630 --> 00:26:41,750 que es 556 00:26:41,750 --> 00:26:43,710 instanciar 557 00:26:43,710 --> 00:26:46,190 como puedo hacer yo hacer esto, instanciar 558 00:26:46,190 --> 00:26:47,569 sin tener que crear 559 00:26:47,569 --> 00:26:49,470 sin tener que tener creada la clase 560 00:26:49,470 --> 00:26:51,970 saludar bien, pues lo que puedo hacer es 561 00:26:51,970 --> 00:26:53,990 dar directamente aquí 562 00:26:53,990 --> 00:26:56,069 el código del método, punto pelota 563 00:26:56,069 --> 00:26:57,809 doy el código del método 564 00:26:57,809 --> 00:27:00,190 y se convierte en una 565 00:27:00,190 --> 00:27:01,809 creación de instancia 566 00:27:01,809 --> 00:27:04,250 de esta interfaz cuya implementación 567 00:27:04,250 --> 00:27:06,069 del método interno es la que yo doy aquí 568 00:27:06,069 --> 00:27:08,130 doy aquí el código del método 569 00:27:08,130 --> 00:27:10,049 y eso es una función lambda 570 00:27:10,049 --> 00:27:11,509 entonces aquí podemos dar 571 00:27:11,509 --> 00:27:18,049 aquí en lugar de esto 572 00:27:18,049 --> 00:27:20,309 sustituimos esto 573 00:27:20,309 --> 00:27:23,329 por una función lambda 574 00:27:23,329 --> 00:27:26,740 y la función lambda 575 00:27:26,740 --> 00:27:27,259 ¿qué es? 576 00:27:27,700 --> 00:27:30,079 es la implementación del método abstracto 577 00:27:30,079 --> 00:27:31,359 es solamente eso 578 00:27:31,359 --> 00:27:39,240 si, un método lambda 579 00:27:39,240 --> 00:27:40,019 es una 580 00:27:40,019 --> 00:27:42,420 implementación 581 00:27:42,420 --> 00:27:43,579 de una instancia 582 00:27:43,579 --> 00:27:45,400 de una interfaz funcional 583 00:27:45,400 --> 00:27:46,619 la implementación de una interfaz funcional 584 00:27:46,619 --> 00:27:49,099 implementación del método astral 585 00:27:49,099 --> 00:27:54,079 entonces, tú solamente puedes proveer 586 00:27:54,079 --> 00:27:54,640 una lambda 587 00:27:54,640 --> 00:27:57,940 a quien te esté pidiendo una interfaz funcional 588 00:27:57,940 --> 00:27:59,200 a quien te la esté pidiendo 589 00:27:59,200 --> 00:28:01,519 vale, pues 590 00:28:01,519 --> 00:28:03,740 los principios de 591 00:28:03,740 --> 00:28:05,539 programación de la función lambda 592 00:28:05,539 --> 00:28:07,420 para hacerlo de andar por casa 593 00:28:07,420 --> 00:28:09,579 son muy sencillos, las funciones lambda 594 00:28:09,579 --> 00:28:11,500 tienen esta cosita, tan bona 595 00:28:11,500 --> 00:28:12,740 que separa 596 00:28:12,740 --> 00:28:15,579 parámetros de entrada de ese método 597 00:28:15,579 --> 00:28:17,599 De código de salida 598 00:28:17,599 --> 00:28:18,640 ¿Vale? 599 00:28:18,920 --> 00:28:20,940 Los parámetros de entrada del método 600 00:28:20,940 --> 00:28:23,640 Van separados por comas entre paréntesis 601 00:28:23,640 --> 00:28:26,420 Y va con su nombre tal cual 602 00:28:26,420 --> 00:28:28,559 Ni tipo ni nada 603 00:28:28,559 --> 00:28:29,839 Porque el tipo ya 604 00:28:29,839 --> 00:28:33,039 Se infiere luego en tiempo de ejecución 605 00:28:33,039 --> 00:28:34,680 En función de quien va a estar llamando 606 00:28:34,680 --> 00:28:35,660 Ya se va a inferir 607 00:28:35,660 --> 00:28:36,599 Ahí no hay que poner tipo 608 00:28:36,599 --> 00:28:40,200 Y aquí el código que sea 609 00:28:40,200 --> 00:28:42,299 Entonces 610 00:28:42,299 --> 00:28:46,839 esto es una función lambda válida 611 00:28:46,839 --> 00:28:50,119 que sirve para implementar un método abstracto 612 00:28:50,119 --> 00:28:52,259 que reciba dos parámetros 613 00:28:52,259 --> 00:28:55,119 y te devuelve, color de retorno, la suma de los dos 614 00:28:55,119 --> 00:28:57,640 o sea, esta sería un lambda válido 615 00:28:57,640 --> 00:29:00,240 para un método que sea algo así 616 00:29:00,240 --> 00:29:01,180 por ejemplo 617 00:29:01,180 --> 00:29:08,599 int suma int a int b 618 00:29:08,599 --> 00:29:11,950 ¿vale? 619 00:29:11,950 --> 00:29:15,009 si yo tengo una interfaz funcional 620 00:29:15,009 --> 00:29:17,150 cuyo método abstracto es este, me devuelve 621 00:29:17,150 --> 00:29:18,930 un valor y necesita 622 00:29:18,930 --> 00:29:19,650 dos parámetros 623 00:29:19,650 --> 00:29:22,730 esta lambda encaja en él perfectamente 624 00:29:22,730 --> 00:29:28,140 bueno, pues 625 00:29:28,140 --> 00:29:30,200 aquí en nuestro caso particular 626 00:29:30,200 --> 00:29:32,140 cuando solamente 627 00:29:32,140 --> 00:29:33,700 hay un parámetro de entrada 628 00:29:33,700 --> 00:29:35,220 no se pone entre paréntesis 629 00:29:35,220 --> 00:29:36,740 se pone 630 00:29:36,740 --> 00:29:39,500 la x, y ya está 631 00:29:39,500 --> 00:29:41,819 se suelen llamar las parámetros de entrada x, y, z 632 00:29:41,819 --> 00:29:43,519 ¿vale? 633 00:29:43,519 --> 00:29:45,460 puede no tener parámetros de entrada 634 00:29:45,460 --> 00:29:47,720 el método, entonces no se pone nada 635 00:29:47,720 --> 00:29:49,940 hay pequeños, la sintaxis 636 00:29:49,940 --> 00:29:50,900 de la función lambda 637 00:29:50,900 --> 00:29:53,700 pues uno la mira sintaxis para hacer una función lambda 638 00:29:53,700 --> 00:29:55,460 y no tiene mayor historia 639 00:29:55,460 --> 00:29:57,579 es ir probando y se acabó 640 00:29:57,579 --> 00:29:59,420 que sepamos simplemente que la idea es esa 641 00:29:59,420 --> 00:30:02,000 este simbolito, parámetros de entrada 642 00:30:02,000 --> 00:30:04,000 aquí separados por comas entre paréntesis 643 00:30:04,000 --> 00:30:05,099 y no es menos que sea solo uno 644 00:30:05,099 --> 00:30:07,400 y aquí el código que puede ser más de una línea 645 00:30:07,400 --> 00:30:09,220 puede ser línea separada por un poco de coma 646 00:30:09,220 --> 00:30:10,299 lo que queremos que haga el método 647 00:30:10,299 --> 00:30:13,559 Que puede devolver algo o puede no devolver nada 648 00:30:13,559 --> 00:30:14,839 No he puesto ahí el return 649 00:30:14,839 --> 00:30:15,960 ¿Vale? Debería 650 00:30:15,960 --> 00:30:19,019 Bueno, pues entonces 651 00:30:19,019 --> 00:30:21,900 Aquí si pasamos del saludar bien y del saludar mal 652 00:30:21,900 --> 00:30:26,960 Vamos a instanciar 653 00:30:26,960 --> 00:30:29,440 Ese 1 y ese 2 pasando de esas clases 654 00:30:29,440 --> 00:30:34,660 Bueno, pues a ver 655 00:30:34,660 --> 00:30:37,359 ¿Qué tipo de función lambda deberíamos ofrecer aquí? 656 00:30:38,420 --> 00:30:40,920 Una que recibe un único parámetro 657 00:30:40,920 --> 00:30:45,160 Y lo que hace es mostrar este mensajito 658 00:30:45,160 --> 00:30:47,180 Pues vamos a hacer eso mismo 659 00:30:47,180 --> 00:30:50,259 Es muy fácil 660 00:30:50,259 --> 00:30:51,759 De nuevo 661 00:30:51,759 --> 00:30:54,799 Hasta la complejidad que se quiera meter uno 662 00:30:54,799 --> 00:30:57,180 Pues x y ahora 663 00:30:57,180 --> 00:31:11,490 Vamos a dejarla tal cual 664 00:31:11,490 --> 00:31:15,980 Cambiando nombre por x 665 00:31:15,980 --> 00:31:16,740 Lógicamente 666 00:31:16,740 --> 00:31:20,349 Vale 667 00:31:20,349 --> 00:31:22,769 Como veis 668 00:31:22,769 --> 00:31:25,529 Me la coge, ya está, ya tengo mi función lambda 669 00:31:25,529 --> 00:31:29,660 Que quiero instanciar 670 00:31:29,660 --> 00:31:30,440 S2 671 00:31:30,440 --> 00:31:34,220 Porque quiero hacer dos instancias 672 00:31:34,220 --> 00:31:35,400 diferentes para 673 00:31:35,400 --> 00:31:37,339 dos saludos 674 00:31:37,339 --> 00:31:38,519 o es lo mismo 675 00:31:38,519 --> 00:31:57,619 son los parámetros de entrada 676 00:31:57,619 --> 00:31:59,940 al método abstracto que tenga esta interfaz 677 00:31:59,940 --> 00:32:01,720 esta interfaz tiene su 678 00:32:01,720 --> 00:32:03,039 método abstracto único 679 00:32:03,039 --> 00:32:04,960 con sus parámetros de entrada 680 00:32:04,960 --> 00:32:08,059 y su posible valor de salida o no 681 00:32:08,059 --> 00:32:10,119 pues los parámetros de entrada 682 00:32:10,119 --> 00:32:12,119 tendrán que estar aquí separados por comas 683 00:32:12,119 --> 00:32:13,380 dándole el nombre que tú quieras 684 00:32:13,380 --> 00:32:15,039 la idea de la función lambda 685 00:32:15,039 --> 00:32:17,940 es que quede cortita porque va a ir una línea 686 00:32:17,940 --> 00:32:20,180 entonces aquí no aplica 687 00:32:20,180 --> 00:32:22,619 lo que hemos dicho siempre 688 00:32:22,619 --> 00:32:24,839 de por favor nombres de identificadores 689 00:32:24,839 --> 00:32:26,279 lo más explicativo posible 690 00:32:26,279 --> 00:32:27,960 cuando creéis una variable 691 00:32:27,960 --> 00:32:30,079 que es el apellido de alguien 692 00:32:30,079 --> 00:32:32,019 no la llaméis x, llamad apellido 693 00:32:32,019 --> 00:32:34,539 pues todas esas reglas de estilo 694 00:32:34,539 --> 00:32:36,240 aquí no aplican 695 00:32:36,240 --> 00:32:38,880 porque aquí lo que queremos es códigos cortitos 696 00:32:38,880 --> 00:32:39,519 y legibles 697 00:32:39,519 --> 00:32:41,819 entonces aquí a los parámetros de entrada 698 00:32:41,819 --> 00:32:44,500 se le puede llamar x, y, t 699 00:32:44,500 --> 00:32:46,920 en el segundo no tiene que ser y 700 00:32:46,920 --> 00:32:47,779 puede ser X 701 00:32:47,779 --> 00:32:51,079 que más da, son funciones landas independientes 702 00:32:51,079 --> 00:32:53,099 entonces 703 00:32:53,099 --> 00:32:55,359 S1 704 00:32:55,359 --> 00:32:56,700 mientras yo no la cambie 705 00:32:56,700 --> 00:32:58,720 es una instancia de esta interfaz 706 00:32:58,720 --> 00:33:00,900 cuya implementación de su método es esta 707 00:33:00,900 --> 00:33:02,819 ¿vale? S1 708 00:33:02,819 --> 00:33:04,779 podría luego darle otra función landa 709 00:33:04,779 --> 00:33:06,480 pues la ha instanciado otra vez 710 00:33:06,480 --> 00:33:08,019 con otra implementación 711 00:33:08,019 --> 00:33:10,980 entonces esto hace que sea muchísimo más ágil 712 00:33:10,980 --> 00:33:13,359 no tengo que hacer una implementación 713 00:33:13,359 --> 00:33:15,059 por cada comportamiento distinto 714 00:33:15,059 --> 00:33:16,740 doy ese comportamiento 715 00:33:16,740 --> 00:33:18,000 a través de la función en la acta. 716 00:33:20,140 --> 00:33:20,900 No, no, no. 717 00:33:20,940 --> 00:33:21,980 Las clases no me hacen falta 718 00:33:21,980 --> 00:33:24,059 porque las clases las hemos hecho 719 00:33:24,059 --> 00:33:27,279 las clases las hemos hecho 720 00:33:27,279 --> 00:33:29,259 para indicar 721 00:33:29,259 --> 00:33:31,160 cuál es el comportamiento 722 00:33:31,160 --> 00:33:33,259 que yo quiero para esa instancia. 723 00:33:33,779 --> 00:33:35,460 Pero como ese comportamiento 724 00:33:35,460 --> 00:33:37,440 en el momento de instanciarlo 725 00:33:37,440 --> 00:33:40,700 ya se lo voy a dar aquí 726 00:33:40,700 --> 00:33:43,359 en el momento de instanciarlo 727 00:33:43,359 --> 00:33:45,319 estoy rellenando el método 728 00:33:45,319 --> 00:33:46,500 en el momento de instanciarlo 729 00:33:46,500 --> 00:33:49,200 Luego no necesito hacer la clase que lo implementa 730 00:33:49,200 --> 00:33:51,099 Porque aquí ya estoy rellenando el método 731 00:33:51,099 --> 00:33:51,839 ¿Vale? 732 00:33:55,839 --> 00:33:57,599 Y yo puedo redefinir 733 00:33:57,599 --> 00:34:00,440 Esta interfaz siempre que quiera con funciones lambda 734 00:34:00,440 --> 00:34:01,180 Distintas 735 00:34:01,180 --> 00:34:06,779 Vale, si ejecutamos esto 736 00:34:06,779 --> 00:34:07,740 Pues hará lo mismo 737 00:34:07,740 --> 00:34:12,059 ¿Vale? 738 00:34:12,619 --> 00:34:27,110 ¿Algo no te cuadra? 739 00:34:27,750 --> 00:34:27,929 Sí 740 00:34:27,929 --> 00:34:29,070 ¿El qué? 741 00:34:29,369 --> 00:34:30,389 El método de abajo 742 00:34:30,389 --> 00:34:38,309 ¿Cómo el método de abajo? 743 00:34:38,329 --> 00:34:49,210 Sí, a ver, el método de abajo, claro, puedo pasarle aquí directamente, ya me puedo saltar este paso, efectivamente, claro. 744 00:34:52,389 --> 00:35:00,590 Esto como le quedo no más claro, yo aquí tengo que pasar una instancia de segundo, eso está claro. 745 00:35:00,590 --> 00:35:03,110 Entonces, o bien la creo antes 746 00:35:03,110 --> 00:35:04,769 O la paso directamente 747 00:35:04,769 --> 00:35:07,190 Es decir, nosotros podríamos aquí 748 00:35:07,190 --> 00:35:09,570 En lugar de llamar 749 00:35:09,570 --> 00:35:13,380 Crearlas primero 750 00:35:13,380 --> 00:35:14,780 Y luego pasarlas 751 00:35:14,780 --> 00:35:16,559 Podemos también 752 00:35:16,559 --> 00:35:18,320 Hacerlo directamente 753 00:35:18,320 --> 00:35:20,079 A saludar 754 00:35:20,079 --> 00:35:22,559 Es como pasar el new, como antes hemos pasado el new 755 00:35:22,559 --> 00:35:24,739 Ah, pues espérate 756 00:35:24,739 --> 00:35:26,340 Porque esto era lo que yo quería decir ahora 757 00:35:26,340 --> 00:35:27,099 Que también es 758 00:35:27,099 --> 00:35:29,559 Ahora me dices lo otro 759 00:35:29,559 --> 00:35:31,840 Vale, entonces 760 00:35:31,840 --> 00:35:37,619 Porque ese me 761 00:35:37,619 --> 00:35:38,159 Ah, vale 762 00:35:38,159 --> 00:35:41,300 Ay, que no quería esto 763 00:35:41,300 --> 00:35:42,480 Ahí, vale 764 00:35:42,480 --> 00:35:56,050 Coma, nombre 765 00:35:56,050 --> 00:35:57,849 Y aquí 766 00:35:57,849 --> 00:35:59,949 Vale 767 00:35:59,949 --> 00:36:22,110 Con este 768 00:36:22,110 --> 00:36:23,989 System.out tan largo se pierde la 769 00:36:23,989 --> 00:36:25,610 Perspectiva 770 00:36:25,610 --> 00:36:41,019 Vale 771 00:36:41,019 --> 00:36:44,280 Y ya podríamos, ahora vamos con lo 772 00:36:44,280 --> 00:36:46,159 Tuyo, y ya podríamos 773 00:36:46,159 --> 00:36:48,320 Dar el siguiente salto que lo hace más 774 00:36:48,320 --> 00:36:51,119 depende de lo claro que quiera verlo uno en el código 775 00:36:51,119 --> 00:36:51,340 ¿no? 776 00:36:53,239 --> 00:36:55,440 esto es como cuando hacemos un objeto 777 00:36:55,440 --> 00:36:57,440 lo instanciamos con new 778 00:36:57,440 --> 00:36:58,440 y pasamos el objeto 779 00:36:58,440 --> 00:37:00,480 o pasamos el new directamente 780 00:37:00,480 --> 00:37:03,420 depende de cómo quieras hacer todo el código 781 00:37:03,420 --> 00:37:05,380 si quieres dejarlo más claro o no quieres dejarlo claro 782 00:37:05,380 --> 00:37:07,579 si quieres conservar la referencia 783 00:37:07,579 --> 00:37:08,539 y no quieres conservarla 784 00:37:08,539 --> 00:37:10,500 si quieres conservar la referencia 785 00:37:10,500 --> 00:37:12,699 tienes que guardarla en un sitio 786 00:37:12,699 --> 00:37:15,260 pero si te da igual conservarla 787 00:37:15,260 --> 00:37:16,679 porque solo la vas a usar una vez 788 00:37:16,679 --> 00:37:19,039 Pues pasas el new directamente 789 00:37:19,039 --> 00:37:21,239 Pues aquí igual 790 00:37:21,239 --> 00:37:23,900 Yo a saludar, a este método saludar 791 00:37:23,900 --> 00:37:25,179 Le tengo que pasar 792 00:37:25,179 --> 00:37:27,599 Una instancia 793 00:37:27,599 --> 00:37:29,579 De una interfaz funcional, obligatorio 794 00:37:29,579 --> 00:37:30,500 Y este parámetro 795 00:37:30,500 --> 00:37:33,179 Pues una instancia de una interfaz funcional 796 00:37:33,179 --> 00:37:35,199 Es una función lambda, lo que acabamos de decir 797 00:37:35,199 --> 00:37:37,340 Pues le paso la función lambda tal cual 798 00:37:37,340 --> 00:37:39,800 Le paso la función lambda tal cual 799 00:37:39,800 --> 00:37:41,579 La queja queda un poco larga porque tiene el sistema 800 00:37:41,579 --> 00:37:42,280 Outprintln 801 00:37:42,280 --> 00:37:45,000 Que no lo puedo abreviar porque 802 00:37:45,000 --> 00:37:47,659 lo concatenamos con esto, lo de abreviar lo veremos 803 00:37:47,659 --> 00:37:49,679 ahora, ¿vale? pero le paso 804 00:37:49,679 --> 00:37:50,780 la función lambda tal cual 805 00:37:50,780 --> 00:37:55,400 claro, x barrita 806 00:37:55,400 --> 00:37:57,619 le paso la función lambda 807 00:37:57,619 --> 00:37:59,599 y le estoy pasando la instancia, ¿vale? 808 00:38:03,090 --> 00:38:03,949 ¿y tu duda cuál era? 809 00:38:04,670 --> 00:38:05,670 lo que yo digo es que 810 00:38:05,670 --> 00:38:07,809 estás creando la instancia saludar 811 00:38:07,809 --> 00:38:08,409 ese 1, ¿no? 812 00:38:08,889 --> 00:38:10,210 la función lambda 813 00:38:10,210 --> 00:38:13,489 ya tienen los métodos 814 00:38:13,489 --> 00:38:15,670 ya puedes hacer ese 1.saludar 815 00:38:15,670 --> 00:38:21,650 Podría llamar a ese uno 816 00:38:21,650 --> 00:38:23,110 Punto saludar 817 00:38:23,110 --> 00:38:24,730 ¿Vale? 818 00:38:25,110 --> 00:38:26,690 Y pasar el nombre, ¿vale? 819 00:38:26,730 --> 00:38:28,010 Lo que pasa es que no sería el uso 820 00:38:28,010 --> 00:38:30,349 No sería el uso 821 00:38:30,349 --> 00:38:36,849 Ya, pero bueno 822 00:38:36,849 --> 00:38:39,130 Sí, pero a ver, lo que estoy reflejando 823 00:38:39,130 --> 00:38:41,230 Lo que estoy reflejando es que a un método 824 00:38:41,230 --> 00:38:42,550 Le puedes pasar comportamiento 825 00:38:42,550 --> 00:38:45,349 En este caso este método a su vez 826 00:38:45,349 --> 00:38:47,369 saluda. O sea, los dos métodos hacen lo mismo. 827 00:38:47,929 --> 00:38:49,369 Pero a lo mejor este método de abajo 828 00:38:49,369 --> 00:38:51,730 podría hacer otra cosa con este comportamiento. 829 00:38:52,030 --> 00:38:53,329 ¿Vale? No tendría por qué 830 00:38:53,329 --> 00:38:54,329 hacer lo mismo. ¿Vale? 831 00:38:59,070 --> 00:39:01,030 Venga, pues paramos un momentico.