interfaces - java 8 tutorial
¿Para qué sirve la interfaz funcional en Java 8? (10)
Encontré un nuevo término llamado Interfaz funcional en Java 8.
Solo pude encontrar un uso de esta interfaz mientras trabajaba con expresiones lambda .
Java 8 proporciona algunas interfaces funcionales integradas y, si queremos definir alguna interfaz funcional, podemos utilizar la anotación
@FunctionalInterface
.
Nos permitirá declarar un solo método en la interfaz.
Por ejemplo:
@FunctionalInterface
interface MathOperation {
int operation(int a, int b);
}
¿Qué tan útil es en Java 8 además de trabajar con expresiones lambda ?
La pregunta here es diferente de la que hice. Se pregunta por qué necesitamos una interfaz funcional mientras trabajamos con la expresión Lambda. Mi pregunta es: ¿por qué usar la interfaz funcional que no sea directamente con expresiones lambda ?
Además de otras respuestas, creo que la razón principal para "por qué usar una interfaz funcional que no sea directamente con expresiones lambda" puede estar relacionada con la naturaleza del lenguaje Java que está orientado a objetos.
Los principales atributos de las expresiones Lambda son: 1. Se pueden pasar alrededor de 2. y se pueden ejecutar en el futuro en un tiempo específico (varias veces). Ahora, para admitir esta función en idiomas, algunos otros idiomas se ocupan simplemente de este asunto.
Por ejemplo, en Java Script, una función (función anónima o literales de función) se puede abordar como un objeto. Por lo tanto, puede crearlos simplemente y también se pueden asignar a una variable, etc. Por ejemplo:
var myFunction = function (...) {
...;
}
alert(myFunction(...));
o a través de ES6, puede usar una función de flecha.
const myFunction = ... => ...
Hasta ahora, los diseñadores de lenguaje Java no han aceptado manejar las características mencionadas de esta manera (técnicas de programación funcional). Creen que el lenguaje Java está orientado a objetos y, por lo tanto, deberían resolver este problema mediante técnicas orientadas a objetos. No quieren perderse la simplicidad y la coherencia del lenguaje Java.
Por lo tanto, usan interfaces, ya que cuando se necesita un objeto de una interfaz con un solo método (me refiero a la interfaz funcional), puede reemplazarlo con una expresión lambda. Como:
ActionListener listener = event -> ...;
Como otros han dicho, una interfaz funcional es una interfaz que expone un método. Puede tener más de un método, pero todos los demás deben tener una implementación predeterminada. La razón por la que se llama "interfaz funcional" es porque efectivamente actúa como una función. Como puede pasar interfaces como parámetros, significa que las funciones ahora son "ciudadanos de primera clase" como en los lenguajes de programación funcionales. Esto tiene muchos beneficios, y los verá bastante cuando use la API Stream. Por supuesto, las expresiones lambda son el principal uso obvio para ellas.
De ningún modo. Las expresiones lambda son el único punto de esa anotación.
Interfaz funcional:
- Introducido en Java 8
- Interfaz que contiene un método de "resumen único".
Ejemplo 1:
interface CalcArea { // --functional interface
double calcArea(double rad);
}
Ejemplo 2
interface CalcGeometry { // --functional interface
double calcArea(double rad);
default double calcPeri(double rad) {
return 0.0;
}
}
Ejemplo 3
interface CalcGeometry { // -- not functional interface
double calcArea(double rad);
double calcPeri(double rad);
}
Anotación
@FunctionalInterface
-
@FunctionalInterface
- La anotación comprueba que la interfaz contiene solo un método abstracto. De lo contrario, generar error.
- Aunque falta @FunctionalInterface, sigue siendo una interfaz funcional (si tiene un método abstracto único). La anotación ayuda a evitar errores.
- La interfaz funcional puede tener métodos estáticos y predeterminados adicionales.
- por ejemplo, Iterable <>, Comparable <>, Comparator <>.
Aplicaciones de la interfaz funcional:
- Referencias de métodos
- Expresión lambda
- Referencias del constructor
Para aprender interfaces funcionales, aprenda los primeros métodos predeterminados en la interfaz, y después de aprender la interfaz funcional, le resultará fácil comprender la referencia del método y la expresión lambda
La documentation realmente hace una diferencia entre el propósito
Un tipo de anotación informativa que se utiliza para indicar que una declaración de tipo de interfaz está destinada a ser una interfaz funcional tal como se define en la Especificación del lenguaje Java.
y el caso de uso
Tenga en cuenta que las instancias de interfaces funcionales se pueden crear con expresiones lambda, referencias de métodos o referencias de constructor.
cuya redacción no excluye otros casos de uso en general. Dado que el objetivo principal es indicar una interfaz funcional , su pregunta real se reduce a "¿Hay otros casos de uso para interfaces funcionales que no sean expresiones lambda y referencias de método / constructor?"
Dado que la interfaz funcional es una construcción de lenguaje Java definida por la Especificación del lenguaje Java, solo esa especificación puede responder a esa pregunta:
JLS §9.8. Interfaces funcionales
...
Además del proceso habitual de crear una instancia de interfaz declarando e instanciando una clase (§15.9), se pueden crear instancias de interfaces funcionales con expresiones de referencia de método y expresiones lambda (§15.13, §15.27).
Entonces, la Especificación del lenguaje Java no dice lo contrario, el único caso de uso mencionado en esa sección es el de crear instancias de interfaz con expresiones de referencia de método y expresiones lambda. (Esto incluye referencias de constructor, ya que se indican como una forma de expresión de referencia de método en la especificación).
Entonces, en una oración, no, no hay otro caso de uso en Java 8.
Puedes usar lambda en Java 8
public static void main(String[] args) {
tentimes(inputPrm - > System.out.println(inputPrm));
//tentimes(System.out::println); // You can also replace lambda with static method reference
}
public static void tentimes(Consumer myFunction) {
for (int i = 0; i < 10; i++)
myFunction.accept("hello");
}
Para más información sobre Java Lambdas y FunctionalInterfaces
Se puede asignar una expresión lambda a un tipo de interfaz funcional, pero también se pueden hacer referencias a métodos y clases anónimas.
Una cosa buena acerca de las interfaces funcionales específicas en
java.util.function
es que se pueden componer para crear nuevas funciones (como
Function.andThen
y
Function.compose
,
Predicate.and
, etc.) debido a los prácticos métodos predeterminados que contienen.
Una interfaz con un solo método abstracto se llama Interfaz funcional. No es obligatorio usar @FunctionalInterface, pero es una buena práctica usarlo con interfaces funcionales para evitar la adición accidental de métodos adicionales. Si la interfaz se anota con la anotación @FunctionalInterface e intentamos tener más de un método abstracto, arroja un error del compilador.
package com.akhi;
@FunctionalInterface
public interface FucnctionalDemo {
void letsDoSomething();
//void letsGo(); //invalid because another abstract method does not allow
public String toString(); // valid because toString from Object
public boolean equals(Object o); //valid
public static int sum(int a,int b) // valid because method static
{
return a+b;
}
public default int sub(int a,int b) //valid because method default
{
return a-b;
}
}
@FunctionalInterface
anotación
@FunctionalInterface
es útil para la comprobación del tiempo de compilación de su código.
No puede tener más de un método además de los métodos
static
,
default
y abstractos que anulan los métodos en
Object
en su
@FunctionalInterface
o cualquier otra interfaz utilizada como interfaz funcional.
Pero puede usar lambdas sin esta anotación, así como puede anular los métodos sin la anotación
@Override
.
De documentos
Una interfaz funcional tiene exactamente un método abstracto. Como los métodos predeterminados tienen una implementación, no son abstractos. Si una interfaz declara un método abstracto que anula uno de los métodos públicos de java.lang.Object, eso tampoco cuenta para el recuento de métodos abstractos de la interfaz ya que cualquier implementación de la interfaz tendrá una implementación de java.lang.Object u otro lugar
Esto se puede usar en la expresión lambda:
public interface Foo {
public void doSomething();
}
Esto no se puede usar en la expresión lambda:
public interface Foo {
public void doSomething();
public void doSomethingElse();
}
Pero esto dará error de compilación :
@FunctionalInterface
public interface Foo {
public void doSomething();
public void doSomethingElse();
}
Anotación ''@FunctionalInterface'' no válida; Foo no es una interfaz funcional
@FunctionalInterface
es una nueva anotación que se lanza con Java 8 y proporciona tipos de destino para expresiones lambda y se utiliza en la comprobación del tiempo de compilación de su código.
Cuando quieras usarlo:
1- Su interfaz no debe tener más de un método abstracto, de lo contrario se generará un error de compilación.
1- Su interfaz
debe
ser pura, lo que significa que la interfaz funcional está diseñada para ser implementada por clases sin estado, por ejemplo, la interfaz de
Comparator
es pura porque no depende del estado de los implementadores, en este caso
no
se producirá
ningún
error de compilación, pero en muchos casos no podrás usar lambda con este tipo de interfaces
El paquete
java.util.function
contiene varias interfaces funcionales de propósito general, como
Predicate
,
Consumer
,
Function
y
Supplier
.
También tenga en cuenta que puede usar lambdas sin esta anotación.