¿Qué es una Interfaz Funcional?
Es momento de profundizar en cómo se crean las lambdas en Java y cuál es la relación de las interfaces funcionales con ellas.
Una interfaz funcional puede utilizarse para representar una acción u operación que puede ejecutarse. En lugar de crear una clase completa para una tarea sencilla, se puede definir una interfaz con un único método que describa la acción.
Ejemplo de una interfaz funcional:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
La anotación @FunctionalInterface es opcional, pero ayuda al compilador y a los desarrolladores al garantizar que la interfaz permanezca funcional y evita la adición de múltiples métodos abstractos.
¿Por qué las necesitamos?
En la Stream API, las interfaces funcionales se utilizan para pasar diferentes comportamientos a métodos que trabajan con colecciones de datos.
Por ejemplo, es posible pasar una condición de filtrado a un método que selecciona elementos específicos de una lista o proporcionar una operación para transformar cada elemento, como se observa en métodos como filter() y map().
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
El método filter() utiliza una interfaz funcional especial llamada Predicate<T> (que se estudiará más adelante), la cual verifica si un elemento cumple con una determinada condición. En este caso, la expresión lambda n -> n % 2 == 0 determina si un número es par. Si el número es divisible por 2 sin residuo, permanece en el stream.
Creación de una interfaz funcional personalizada
Suponga que se requiere una interfaz para realizar operaciones aritméticas como suma o resta.
Se puede crear una interfaz funcional denominada ArithmeticOperation con un método apply que realiza una operación sobre dos números, a y b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Ahora que tienes la interfaz, puedes utilizar expresiones lambda para definir diferentes operaciones como suma y resta:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
Las expresiones lambda (a, b) -> a + b y (a, b) -> a - b implementan el método apply de la interfaz, realizando respectivamente la suma y la resta. La primera expresión lambda devuelve la suma de dos números, mientras que la segunda devuelve su diferencia.
Este enfoque proporciona una forma flexible de utilizar diferentes operaciones aritméticas sin la necesidad de crear clases separadas para cada una.
1. ¿Qué es una interfaz funcional en Java?
2. ¿Qué expresión lambda implementa correctamente la siguiente interfaz funcional?
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 2.33
¿Qué es una Interfaz Funcional?
Desliza para mostrar el menú
Es momento de profundizar en cómo se crean las lambdas en Java y cuál es la relación de las interfaces funcionales con ellas.
Una interfaz funcional puede utilizarse para representar una acción u operación que puede ejecutarse. En lugar de crear una clase completa para una tarea sencilla, se puede definir una interfaz con un único método que describa la acción.
Ejemplo de una interfaz funcional:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod(); // The only abstract method
}
La anotación @FunctionalInterface es opcional, pero ayuda al compilador y a los desarrolladores al garantizar que la interfaz permanezca funcional y evita la adición de múltiples métodos abstractos.
¿Por qué las necesitamos?
En la Stream API, las interfaces funcionales se utilizan para pasar diferentes comportamientos a métodos que trabajan con colecciones de datos.
Por ejemplo, es posible pasar una condición de filtrado a un método que selecciona elementos específicos de una lista o proporcionar una operación para transformar cada elemento, como se observa en métodos como filter() y map().
Main.java
1234567891011121314151617package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); // Using `filter()` to extract even numbers List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) // Predicate: keeps only even numbers .collect(Collectors.toList()); System.out.println(evenNumbers); } }
El método filter() utiliza una interfaz funcional especial llamada Predicate<T> (que se estudiará más adelante), la cual verifica si un elemento cumple con una determinada condición. En este caso, la expresión lambda n -> n % 2 == 0 determina si un número es par. Si el número es divisible por 2 sin residuo, permanece en el stream.
Creación de una interfaz funcional personalizada
Suponga que se requiere una interfaz para realizar operaciones aritméticas como suma o resta.
Se puede crear una interfaz funcional denominada ArithmeticOperation con un método apply que realiza una operación sobre dos números, a y b.
@FunctionalInterface
public interface ArithmeticOperation {
int apply(int a, int b); // Method to perform an operation on two numbers
}
Ahora que tienes la interfaz, puedes utilizar expresiones lambda para definir diferentes operaciones como suma y resta:
Main.java
1234567891011public class Main { public static void main(String[] args) { // Addition ArithmeticOperation add = (a, b) -> a + b; System.out.println("Sum: " + add.apply(5, 3)); // 8 // Subtraction ArithmeticOperation subtract = (a, b) -> a - b; System.out.println("Difference: " + subtract.apply(5, 3)); // 2 } }
Las expresiones lambda (a, b) -> a + b y (a, b) -> a - b implementan el método apply de la interfaz, realizando respectivamente la suma y la resta. La primera expresión lambda devuelve la suma de dos números, mientras que la segunda devuelve su diferencia.
Este enfoque proporciona una forma flexible de utilizar diferentes operaciones aritméticas sin la necesidad de crear clases separadas para cada una.
1. ¿Qué es una interfaz funcional en Java?
2. ¿Qué expresión lambda implementa correctamente la siguiente interfaz funcional?
¡Gracias por tus comentarios!