Interface fonctionnelle Java 8 sans arguments et sans valeur de retour

110

Quelle est l'interface fonctionnelle Java 8 pour une méthode qui ne prend rien et ne renvoie rien?

Ie, l'équivalent du C # sans paramètre Actionavec le voidtype de retour?

Miguel Gamboa
la source

Réponses:

98

Si je comprends bien, vous voulez une interface fonctionnelle avec une méthode void m(). Dans ce cas, vous pouvez simplement utiliser un fichier Runnable.

assylies
la source
29
RunnableLa spécification de l'interface indique qu'il s'agit de fournir un code exécutable à la Threadclasse. Il ne me semble pas juste de l'utiliser Runnablelà où il n'est pas destiné à être exécuté par un thread; semble trompeur. Runnableest défini comme a FunctionalInterfacecar il répond à la spécification d'une interface fonctionnelle et peut être créé à l'aide de la syntaxe lambda. Pourquoi ne pas créer votre propre interface fonctionnelle? voir Runnable , voir FunctionalInterface
TheSecretSquad
6
@TheSecretSquad (i) Runnableest annoté avec @FunctionalInterfaceet (ii) même dans le contexte d'une expression lambda il sera exécuté sur un thread: le thread dans lequel le lambda est exécuté qui peut être le thread courant ...
assylias
9
Je suis d'accord avec @TheSecretSquad, bien que cela satisfasse l'exigence fonctionnelle, cela ne semble pas très sémantique, Runnable est généralement associé à la création de threads. Une interface fonctionnelle simple Worker avec une méthode doWork aurait été bien. EDIT: Oups: stackoverflow.com/questions/27973294/…
jpangamarca
6
"Oups" de @ jpangamarca ci-dessus: Dans les commentaires sur la question en double qu'il a liée, Brian Goetz a confirmé qu'elle Runnableétait destinée à être utilisée à cette fin, pas seulement pour les contextes de thread.
Joshua Goldberg
10
Étant donné que c'est le cas, cependant, je pense que le javadoc devrait être rendu plus générique: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg
15

Faites le vôtre

@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();
        };
    }
}

et utilisez-le comme ça

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();

}

et la sortie

HelloWorld
WorldHello
Charana
la source
Compte tenu de l’éthique de la question, j’ai vraiment le sentiment que cela devrait être la réponse acceptée.
corsiKa
0

@FunctionalInterface autorise uniquement la méthode abstraite de la méthode Par conséquent, vous pouvez instancier cette interface avec l'expression lambda comme ci-dessous et vous pouvez accéder aux membres de l'interface

        @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
la source