Interfaz funcional Java 8 sin argumentos y sin valor de retorno

110

¿Cuál es la interfaz funcional de Java 8 para un método que no toma nada y no devuelve nada?

Es decir, ¿el equivalente a C # sin parámetros Actioncon voidtipo de retorno?

Miguel Gamboa
fuente

Respuestas:

97

Si entiendo correctamente, desea una interfaz funcional con un método void m(). En cuyo caso, simplemente puede usar un Runnable.

Assylias
fuente
29
RunnableLa especificación de la interfaz indica que debe proporcionar código ejecutable a la Threadclase. No me parece correcto usarlo Runnabledonde no está destinado a ser ejecutado por un hilo; parece engañoso. Runnablese define como a FunctionalInterfaceporque cumple con la especificación de una interfaz funcional y se puede crear utilizando la sintaxis lambda. ¿Por qué no crear su propia interfaz funcional? ver Runnable , ver FunctionalInterface
TheSecretSquad
6
@TheSecretSquad (i) Runnableestá anotado con @FunctionalInterfacey (ii) incluso en el contexto de una expresión lambda se ejecutará en un hilo: el hilo en el que se ejecuta el lambda que puede ser el hilo actual ...
assylias
9
Estoy de acuerdo con @TheSecretSquad, aunque satisface el requisito funcional, no suena muy semántico, Runnable se asocia comúnmente con la creación de hilos. Una interfaz funcional simple de Worker con un método doWork hubiera estado bien. EDITAR: Vaya: stackoverflow.com/questions/27973294/…
jpangamarca
6
Desarrollando el "Ups" de @ jpangamarca arriba: En los comentarios sobre la pregunta duplicada que vinculó, Brian Goetz confirmó que Runnableestaba destinado a ser utilizado para este propósito, no solo para contextos de hilos.
Joshua Goldberg
10
Sin embargo, dado que ese es el caso, creo que el javadoc debería hacerse más genérico: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg
15

Solo haz el tuyo

@FunctionalInterface
public interface Procedure {
    void run();

    default Procedure andThen(Procedure after){
        return () -> {
            this.run();
            after.run();
        };
    }

    default Procedure compose(Procedure before){
        return () -> {
            before.run();
            this.run();
        };
    }
}

y úsalo así

public static void main(String[] args){
    Procedure procedure1 = () -> System.out.print("Hello");
    Procedure procedure2 = () -> System.out.print("World");

    procedure1.andThen(procedure2).run();
    System.out.println();
    procedure1.compose(procedure2).run();

}

y la salida

HelloWorld
WorldHello
Charana
fuente
Realmente siento, dada la ética de la pregunta, que esta debería ser la respuesta aceptada.
corsiKa
0

@FunctionalInterface solo permite el método método abstracto Por lo tanto, puede crear una instancia de esa interfaz con la expresión lambda como se muestra a continuación y puede acceder a los miembros de la interfaz

        @FunctionalInterface
        interface Hai {

            void m2();

            static void m1() {
                System.out.println("i m1 method:::");
            }

            default void log(String str) {
                System.out.println("i am log method:::" + str);
            }

        }

    public class Hello {
        public static void main(String[] args) {

            Hai hai = () -> {};
            hai.log("lets do it.");
            Hai.m1();

        }
    }


output:
i am log method:::lets do it.
i m1 method:::
uma mahesh
fuente