Was ist die Java 8-Funktionsschnittstelle für eine Methode, die nichts nimmt und nichts zurückgibt?
Dh das Äquivalent zu C# ohne Parameter Action
mit void
Rückgabetyp?
Miguel Gamboa
Was ist die Java 8-Funktionsschnittstelle für eine Methode, die nichts nimmt und nichts zurückgibt?
Dh das Äquivalent zu C# ohne Parameter Action
mit void
Rückgabetyp?
Assyrien
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
.
Runnable
Die Schnittstellenspezifikation von gibt an, dass es ausführbaren Code für die bereitstellen soll Thread
Klasse. Es scheint mir nicht richtig zu sein, es zu verwenden Runnable
wo es nicht für die Ausführung durch einen Thread vorgesehen ist; scheint irreführend. Runnable
ist definiert als ein FunctionalInterface
weil es die Spezifikation einer funktionalen Schnittstelle erfüllt und mit Lambda-Syntax erstellt werden kann. Warum nicht eine eigene funktionale Schnittstelle erstellen? sehen Lauffähigsehen FunctionalInterface
– TheSecretSquad
1. Mai 2015 um 4:02 Uhr
@TheSecretSquad (i) Runnable
ist mit kommentiert @FunctionalInterface
und (ii) selbst im Kontext eines Lambda-Ausdrucks wird es in einem Thread ausgeführt: dem Thread, in dem das Lambda ausgeführt wird, der der aktuelle Thread sein kann …
– Assylias
1. Mai 2015 um 8:36 Uhr
Ich stimme @TheSecretSquad zu, obwohl es die funktionalen Anforderungen erfüllt, klingt es nicht sehr semantisch, Runnable wird häufig mit dem Erstellen von Threads in Verbindung gebracht. Eine einfache Worker-Funktionsschnittstelle mit einer doWork-Methode wäre schön gewesen. BEARBEITEN: Hoppla: stackoverflow.com/questions/27973294/…
– jpangamarca
19. August 2015 um 15:46 Uhr
Konkretisieren Sie @jpangamarcas „Oops“ oben: In den Kommentaren zu der doppelten Frage, die er verlinkt hat, hat Brian Goetz dies bestätigt Runnable
sollte für diesen Zweck verwendet werden, nicht nur für Threading-Kontexte.
– Joshua Goldberg
31. März 2016 um 21:26 Uhr
Da dies jedoch 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
31. März 2016 um 21:29 Uhr
Machen Sie einfach Ihre 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 glaube ich wirklich, dass dies die akzeptierte Antwort sein sollte.
– corsiKa
28. März 2019 um 5:32 Uhr
Uma Mahesh
@FunctionalInterface
erlaubt nur Methode abstrakte Methode Daher können Sie diese Schnittstelle mit dem Lambda-Ausdruck wie unten instanziieren und auf die Schnittstellenmitglieder 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();
}
}
Ausgang:
i am log method:::lets do it.
i m1 method:::