Java 8-Funktionsschnittstelle ohne Argumente und ohne Rückgabewert


109

Was ist die Java 8-Funktionsschnittstelle für eine Methode, die nichts nimmt und nichts zurückgibt?

Dh, die äquivalent zu dem C # parameter Actionmit voidRückgabetyp?

Antworten:


94

Wenn ich das richtig verstehe, möchten Sie eine funktionale Schnittstelle mit einer Methode void m(). In diesem Fall können Sie einfach a verwenden Runnable.


29
RunnableDie Schnittstellenspezifikation gibt an, dass der ThreadKlasse ausführbarer Code bereitgestellt werden soll. Es erscheint mir nicht richtig, dort zu verwenden, Runnablewo es nicht für die Ausführung durch einen Thread vorgesehen ist. scheint irreführend. Runnablewird als definiert, FunctionalInterfaceweil es die Spezifikation einer funktionalen Schnittstelle erfüllt und mithilfe der Lambda-Syntax erstellt werden kann. Warum nicht eine eigene Funktionsoberfläche erstellen? siehe Runnable , siehe FunctionalInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableist mit annotiert @FunctionalInterfaceund (ii) wird sogar im Kontext eines Lambda-Ausdrucks in einem Thread ausgeführt: dem Thread, in dem das Lambda ausgeführt wird, der möglicherweise der aktuelle Thread ist ...
Assylias

9
Ich stimme @TheSecretSquad zu, obwohl es die funktionalen Anforderungen erfüllt, aber nicht sehr semantisch klingt. Runnable wird häufig mit dem Erstellen von Threads assoziiert. Eine einfache Worker-Funktionsschnittstelle mit einer doWork-Methode wäre schön gewesen. EDIT: Ups
jpangamarca

6
Ausarbeitung von @ jpangamarcas "Ups" oben: In den Kommentaren zu der von ihm verlinkten doppelten Frage bestätigte Brian Goetz, dass Runnabledies für diesen Zweck verwendet werden sollte, nicht nur zum Einfädeln von Kontexten.
Joshua Goldberg

10
Angesichts dessen, dass dies der Fall ist, denke ich, dass das Javadoc allgemeiner gestaltet werden sollte: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg

15

Mach einfach deine eigenen

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

und benutze es so

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

}

und die Ausgabe

HelloWorld
WorldHello

Angesichts des Ethos der Frage bin ich wirklich der Meinung, dass dies die akzeptierte Antwort sein sollte.
CorsiKa

0

@FunctionalInterface erlaubt nur Methode abstrakte Methode Daher können Sie diese Schnittstelle mit Lambda-Ausdruck wie unten instanziieren und auf die Schnittstellenelemente zugreifen

        @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:::
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.