Java 8-Pass-Methode als Parameter

Lesezeit: 2 Minuten

Benutzer-Avatar
Torsten Römer

Derzeit in Java 8-Lambda-Ausdrücke und Methodenreferenzen einsteigen.

Ich möchte eine Methode ohne Argumente und ohne Rückgabewert als Argument an eine andere Methode übergeben. So mache ich es:

public void one() {
    System.out.println("one()");
}

public void pass() {
    run(this::one);
}

public void run(final Function function) {
    function.call();
}

@FunctionalInterface
interface Function {
    void call();
}

Ich weiß, dass es eine Reihe vordefinierter funktionaler Schnittstellen gibt java.util.function wie zum Beispiel Function<T,R> aber ich habe keinen gefunden, der keine Argumente hat und kein Ergebnis liefert.

  • Es spielt wirklich keine Rolle; Runnable geht auch. Supplier<Void>, Function<Void, Void>.

    – Joop Eggen

    7. August 2014 um 15:30 Uhr


  • Oh ja, das gute alte Runnable … Ich wusste, dass ich etwas Offensichtliches verpasst habe! Sie sollten dies zu einer Antwort machen, da Sie meine Frage beantwortet haben 🙂

    – Torsten Römer

    7. August 2014 um 15:53 ​​Uhr

Es spielt wirklich keine Rolle; Runnable wird es auch tun.

Consumer<Void>,
Supplier<Void>,
Function<Void, Void>

  • Runnable ist das Beste. Mit Supplier<Void> oder Function<Void,Void> Sie können zur Lieferung gezwungen werden null als Rückgabewert (da der Rückgabetyp ist Void nicht void), und für Consumer<Void> Möglicherweise müssen Sie ein Dummy-Argument deklarieren.

    – Stuart Marks

    8. August 2014 um 19:14 Uhr

  • @StuartMarks, dieser Kommentar wird anderen sicherlich helfen, nach ihrem Sinn für Stil zu wählen. Seltsam, dass es keine java.util.Action/SideEffect oder so gibt. Also.

    – Joop Eggen

    11. August 2014 um 8:09 Uhr


  • Das Problem bei diesen Schnittstellen ist, dass sie keine Semantik haben; sie sind völlig strukturell. Die Semantik kommt davon, wie sie verwendet werden. Da sie auf viele verschiedene Arten verwendet werden können, ist es wirklich schwierig, sie zu benennen. Es wäre sinnvoll, eine Schnittstelle zu verwenden, die ein Ereignis entgegennimmt und void zurückgibt, um aufgerufen zu werden Action Anstatt von Consumer<Event> aber Action macht in anderen Kontexten weniger Sinn. Daher wurden die Namen hauptsächlich so gewählt, dass sie die Struktur widerspiegeln, dh übergebene Argumente und zurückgegebene Werte.

    – Stuart Marks

    11. August 2014 um 13:06 Uhr

  • @StuartMarks Einverstanden, da Lambdas meistens anonym verwendet werden, vielleicht sogar _ (Unterstrich) könnte als Funktionsname verwendet werden. Im Algemeinen Function ist ein guter neutraler Sammelbegriff, obwohl Void void als Rückgabewert und () als Parameterwert vermisst.

    – Joop Eggen

    11. August 2014 um 14:13 Uhr

Sie können Lambda auch so übergeben:

public void pass() {
    run(()-> System.out.println("Hello world"));
}

public void run(Runnable function) {
    function.run();
}

Auf diese Weise übergeben Sie Lambda direkt als Methode.

1178160cookie-checkJava 8-Pass-Methode als Parameter

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy