- Conocer los elementos básicos de las interfaces funcionales en Java
- Crear tu primera inerface funcional
- Apache Maven 3.8.4 o superior
- JDK (o OpenJDK)
Para ejecutar las pruebas de maven usa:
mvn test
-
Definiendo la interfaz
-
Descarga el código del módulo Código
-
En el paquete
org.bedu.jse2.demo.ejemplos
crea la interfazStringToInteger
-
Anota la interfaz con @FunctionalInterface
-
Define el método abstracto
Integer convertir(String str);
-
-
Clase contenedora
-
Crea la clase Ejemplo1 en el paquete
org.bedu.jse2.demo.ejemplos
. -
Agrega el siguiente bloque de código:
Integer sumar(String a, String b){ return null; }
-
-
Prueba unitaria
-
Crea una prueba para la clase Ejemplo1
-
Agrega el siguiente código:
@Test @DisplayName("Suma dos strings convertidos a enteros") void addsUpTwoIntegers(){ String a = "4"; String b = "8"; Integer expected = 12; Ejemplo1 ejemplo1 = new Ejemplo1(); assertEquals(expected, ejemplo1.sumar(a,b)); }
Si ejecutas la prueba en este momento obtendrás un error ya que estamos regresando
null
.
-
-
Implementando la interfaz (clase anónima)
-
Reemplaza el código de la clase de la siguiente manera:
public class Ejemplo1 { private final StringToInteger parser = new StringToInteger() { @Override public Integer convertir(String str) { return Integer.parseInt(str); } }; Integer sumar(String a, String b) { return parser.convertir(a) + parser.convertir(b); } }
-
Vuelve a ejecutar la prueba
En este primer ejemplo estamos usando un método tradicional implementando una clase anónima.
-
-
Implementando la interfaz (lambda)
-
Reemplaza el código de la clase de la siguiente manera
public class Ejemplo1 { private final StringToInteger parser = s -> Integer.parseInt(s); Integer sumar(String a, String b) { return parser.convertir(a) + parser.convertir(b); } }
-
Vuelve a ejecutar la prueba
Esta vez hemos usado una lambda para proveer la implementación de la interfaz. El código es mucho más legible
-
-
Implementando la interfaz (referencia a método)
-
Reemplaza el código de la clase de la siguiente manera
public class Ejemplo1 { private final StringToInteger parser = Integer::parseInt; Integer sumar(String a, String b) { return parser.convertir(a) + parser.convertir(b); } }
-
Vuelve a ejecutar la prueba
Finalmente, cuando una lambda simplemente pasa su argumento a un método, podemos reemplazarla por una referencia directa a ese método, como hicimos en este caso con
Integer::parseInt
.
-
¡Felicidades! Completaste el primer ejemplo.
Siguiente (Reto 1)