Creación y Uso de Interfaces Funcionales Personalizadas en Java
Clase 15 de 39 • Curso de Programación Funcional con Java SE
Contenido del curso
- 2

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

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

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

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

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

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

Inmutabilidad de Datos en Programación Funcional con Java
11:16
- 9
Programación Funcional en Java SE: Conceptos y Prácticas
00:06 - 10

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

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

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

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

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

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

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

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

Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones
12:47 - 19

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

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

Composición de Funciones en Programación Funcional
06:06
- 22

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

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

Programación Funcional en Java: Uso de Streams y Operaciones Terminales
07:21 - 25
Operaciones de Stream en Java: Intermedias y Finales
05:05 - 26

Operaciones y Concurrente con Stream en Java
05:51 - 27
Operaciones Terminales en Java Streams
06:18 - 28
Operaciones Intermedias en Streams de Java
09:21 - 29

Conversión de Strings a Listas de Enteros en Java
06:14
- 30

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

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

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

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

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

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

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

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

Creación de API para búsqueda de empleos con Java y CLI
08:31
¿Cómo definir clases y funciones personalizadas en Java?
Para los desarrolladores de Java, la creación de clases y funciones personalizadas puede ser un camino fascinante para extender las funcionalidades de este lenguaje. Java, con el paquete java.util.function, ofrece la capacidad de definir interfaces funcionales y abstractas. Esto nos da la libertad de crear métodos y estructuras únicas para resolver problemas específicos o mejorar las capacidades de nuestro código. Vamos a explorar cómo hacerlo.
¿Qué es una interfaz SAM en Java?
En Java, una interfaz SAM (Single Abstract Method) es aquella que contiene un único método abstracto definido. Este concepto es crucial ya que permite el uso de expresiones lambda, proporcionando un enfoque más limpio y eficiente para escribir funciones anónimas.
- Definición: Una interfaz SAM tiene un solo método abstracto que requiere implementación.
- Ejemplo: Si definimos una interfaz funcional con un único método, esta puede ser utilizada como una función.
Java introdujo en la versión 8, la anotación @FunctionalInterface para mostrar que una interfaz es funcional. Sin embargo, si añadimos más métodos abstractos a la interfaz, dejaría de ser funcional, y el compilador nos arrojaría un error.
¿Cómo crear una TriFunction en Java?
Para ilustrar el uso de interfaces personalizadas, crearemos una interfaz llamada TriFunction que trabajará con tres parámetros de entrada de diferentes tipos y un tipo de salida. Por ejemplo, puede ser útil para calcular fechas o edades.
@FunctionalInterface
public interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
Esta declaración define una interfaz que recibe tres tipos genéricos T, U, y V, y retorna un tipo R. Podemos implementar esta interfaz para crear funciones que manejen múltiples parámetros con lógica personalizada.
¿Cómo transformar enteros en fechas con lambda?
Supongamos que necesitamos convertir tres números enteros en una fecha, podemos utilizar nuestra TriFunction para esta tarea.
TriFunction<Integer, Integer, Integer, LocalDate> createLocalDate =
(day, month, year) -> LocalDate.parse(year + "-" + month + "-" + day, DateTimeFormatter.ofPattern("yyyy-M-d"));
- Usamos
LocalDate.parse: Este método nos permite convertir una cadena de texto en un objetoLocalDate. DateTimeFormatter: Para asegurar que la cadena se interpreta correctamente, usamos unDateTimeFormattercon el patrón adecuado.
¿Cómo calcular la edad de una persona?
Extendiéndonos más allá de la conversión básica, podemos calcular la edad de una persona utilizando las funciones que hemos implementado. Imaginemos que queremos saber cuántos años han pasado desde una fecha específica hasta hoy.
TriFunction<Integer, Integer, Integer, Integer> calculateAge =
(day, month, year) -> {
LocalDate birthDate = createLocalDate.apply(day, month, year);
return Period.between(birthDate, LocalDate.now()).getYears();
};
Al calcular la edad, es fundamental asegurarnos de que los días y meses menores a 10 estén correctamente formateados para evitar errores en la conversión.
¿Cómo asegurar el formato correcto en las fechas?
Para manejar adecuadamente los días y meses con un solo dígito, añadimos una función que añade un cero a la izquierda cuando es necesario.
Function<Integer, String> addLeadingZero = x -> (x < 10 ? "0" + x : x.toString());
Podemos utilizar esta función dentro de nuestras operaciones con fechas para asegurar el formato correcto:
String dayFormatted = addLeadingZero.apply(day);
String monthFormatted = addLeadingZero.apply(month);
Reflexión final sobre interfaces y funciones en Java
Definir interfaces funcionales como TriFunction y aplicar lambda expressions, no solo simplifica nuestro código, sino que también lo hace más modular y reutilizable. Podemos definir funciones extremadamente específicas para nuestras necesidades mientras preservamos el mantenimiento y la claridad del código. ¡Continúa experimentando con estos conceptos y verás cómo mejora la fluidez de tu desarrollo en Java!