2016-04-24 15 views
1

Ich schreibe ein Programm und ich möchte wissen, ob ich eine Methode als Parameter einer anderen Methode übergeben kann. Zum Beispiel etwas von dem folgenden:Gibt es eine Möglichkeit, eine Methode als Parameter an eine Methode zu übergeben?

public boolean update(Method m){ //input is a method 
    int i = m.execute(); 
    // logic relating to the value of i 
} 

Ich möchte wissen, ob ich das in Java tun kann. Ich lese gerade über funktionale Programmierung und Reflektion.

+1

Können Sie Java 8 verwenden? Es fügt Unterstützung für Lambda-Ausdrücke hinzu, was die funktionale Programmierung viel einfacher macht. Wenn nicht, dann ist Reflektion der Weg, um das zu tun, was Sie fragen. –

+0

Ich entnehme Ihrer Frage, dass Sie nicht versucht haben, ein einfaches Programm zu erstellen, um es auszuprobieren? Auch wenn es nicht funktioniert, ist es eine bessere Frage, wenn Sie Code schreiben, testen und uns über das Ergebnis berichten. Siehe http://stackoverflow.com/help/mcve –

+0

Ja. Lambdas sind sehr nützlich und bieten einige funktionale Programmiermöglichkeiten in Java – Logan

Antwort

2

Dies hat nichts mit Reflektion zu tun, aber Sie können "Methodenreferenzen" übergeben, wenn Sie Java 8+ verwenden. Unter der Annahme von Ihrem Beispiel, das Sie verwenden Methoden beabsichtigen, die keine Parameter übernehmen und nur einen int zurückgeben, können Sie dies tun:

public class MyClass { 
    public int getIntMemberFunction(){ ... } 
    public static int getIntStaticFunction(){ ... } 
} 

mit Update-Funktion wie folgt aussehen geändert,

public boolean update(IntSupplier s){ //input is a method reference or lambda 
    int i = s.get(); 
    // logic relating to the value of i 
} 

Dann Sie nennen könnten update auf jede statische Funktion für jede Klasse so lange in einer Referenz vorbei, da es keine Parameter und gibt einen int nimmt, wie folgt aus:

boolean result = update(MyClass::getIntStaticFunction); 

oder y ou könnte update vorbei in Bezug auf eine Elementfunktion eines bestimmten Objekts aufrufen, solange es keine Parameter und gibt einen int, wie folgt aus:

MyClass myClassInstance = ... 
boolean result = update(myClassInstance::getIntMemberFunction); 

Wenn Sie Methoden hinzufügen möchten, die 1 oder 2 Parameter übernehmen können Sie Versionen von update erstellen, die ToIntFunction oder ToIntBiFunction übernehmen. Über 2 Parameter hinaus müssten Sie Ihre eigenen funktionalen Schnittstellen hinzufügen.

0

Eine Möglichkeit, dies zu tun, ist die Verwendung von Schnittstellen. In Java können Sie als Argument einer Funktion ein Objekt übergeben, das eine bestimmte Schnittstelle implementiert, und Sie können diese Methode für dieses Objekt aufrufen. Modernere Sprachen wie Python, Swift, Javascript, haben eine bessere Unterstützung für dieses Idiom.

Verwandte Themen