usar para interfaces instrucciones funciones funcionales expresiones ejemplos ejemplo como anonimas java lambda java-8 functional-interface

java - para - Implementando una interfaz con dos métodos abstractos por una expresión lambda



lambda ejemplo (4)

Las expresiones Lambda solo se pueden usar con la interfaz funcional como dice Eran, pero si realmente necesitas múltiples métodos dentro de las interfaces, puedes cambiar los modificadores a valores default o static y anularlos dentro de las clases que los implementan si es necesario.

public class Test { public static void main(String[] args) { I1 i1 = () -> System.out.println(); // NOT LEGAL I2 i2 = () -> System.out.println(); // TOTALLY LEGAL I3 i3 = () -> System.out.println(); // TOTALLY LEGAL } } interface I1 { void show1(); void show2(); } interface I2 { void show1(); default void show2() {} } interface I3 { void show1(); static void show2 () {} }

Herencia

No debes olvidar los métodos heredados.

Aquí, I2 hereda show1 y show2 y por lo tanto no puede ser una interfaz funcional.

public class Test { public static void main(String[] args) { I1 i1 = () -> System.out.println(); // NOT LEGAL BUT WE SAW IT EARLIER I2 i2 = () -> System.out.println(); // NOT LEGAL } } interface I1 { void show1(); void show2(); } interface I2 extends I1{ void show3(); }

Anotación

Para asegurarse de que su interfaz sea funcional, puede agregar la siguiente anotación @FunctionalInterface

@FunctionalInterface <------- COMPILATION ERROR : Invalid ''@FunctionalInterface'' annotation; I1 is not a functional interface interface I1 { void show1(); void show2(); } @FunctionalInterface interface I2 { void show3(); }

En Java 8, la expresión lambda se introduce para ayudar con la reducción del código repetitivo. Si la interfaz tiene solo un método, funciona bien. Si consta de varios métodos, ninguno de los métodos funciona. ¿Cómo puedo manejar múltiples métodos?

Podemos ir por el siguiente ejemplo

public interface I1() { void show1(); void show2(); }

Entonces, ¿cuál será la estructura de la función principal para definir los métodos en el principal mismo?


Las expresiones Lambda solo se pueden usar para implementar interfaces funcionales, que son interfaces que tienen un único método abstracto. Una interfaz con dos métodos abstractos no puede ser implementada por una expresión lambda.


Normalmente creo un método de fábrica estático directamente en la interfaz:

public inteface I1 { void show1(); void show2(); public static I1 of(Runnable show1, Runnable show2) { return new I1() { void show1() { show1.run(); } void show2() { show2.run(); } }; } }

Uso:

I1 i1 = I1.of(() -> System.out.println("show1"), () -> System.out.println("show2"));


Siempre puedes usar composición:

public inteface I1 { void show1(); void show2(); } public class I1Adapter { private final Runnable r1,r2; public I1Adapter(Runnable r1, Runnable r2) {this.r1=r1; this.r2=r2;} public void show1() {r1.run();} public void show2() {r2.run();} public static I1Adapter compose(Runnable r1, Runnable r2) { return new I1Adapter(r1,r2); } }

No, puedes hacerlo (con una importación estática):

I1 i1 = compose(()->foo(), ()->bar());