Java-pass-Methode Referenz als parameter an eine andere Methode
Ich versuche mich zu übergeben, einem "get"-Methode von Klasse A eine Methode in der Klasse B. ich habe ausgecheckt Java-Pass-Methode als Parameter, aber ich war nicht in der Lage zu verabschieden, die den interface-Ansatz zu meinem problem in einer angemessenen Art und Weise. Ich würde lieber nicht Verwendung von java 8 (lambdas) und, wenn möglich, vermeiden Sie die Reflexion. Mein Gefühl ist, bin ich auf der Suche auf mein problem der falsche Weg.
Hier ist die spezifische Vereinfachtes Beispiel, was ich versuche zu erreichen:
Ich habe eine Klasse, in der einige Felder und get-Methoden:
public class DataStore {
private float a;
private float b;
private float c;
public float getA() {
return a;
}
public float getB() {
return b;
}
public float getC() {
return c;
}
}
Als Nächstes habe ich meine main-Klasse instanziiert DataStore
als Werte einer Karte und dann Zugriff auf bestimmte Felder der DataStore wie:
public class App {
public static void main(String[] args) {
//declare TreeMap using DataStore class as value
Map<Integer, DataStore> dataMap = new TreeMap<Integer, DataStore>();
//populate Map with example data
dataMap.put(2, new DataStore(1f,2f,3f));
dataMap.put(10, new DataStore(3f,4f,5f));
dataMap.put(4, new DataStore(6f,7f,8f));
//work with specific fields in DataStore, e.g. assign to array
float[] aArray = getValuesAsArray(dataMap, DataStore.getA());
float[] bArray = getValuesAsArray(dataMap, DataStore.getB());
float[] cArray = getValuesAsArray(dataMap, DataStore.getC());
}
/**
* Assign specific field of DataStore from Map to Array
* @param dataMap
* @param getVar - reference for specified getter method
* @return
*/
private static float[] getValuesAsArray(Map<Integer, DataStore> dataMap, MethodReference getVar()) {
int i = 0;
int nMap = dataMap.size();
float[] fArray = new float[nMap];
for (Map.Entry<Integer, DataStore> entry : dataMap.entrySet()) {
DataStore ds = entry.getValue();
fArray[i] = ds.getVar();
i++;
}
return fArray;
}
}
Klar das dies nicht funktionieren, so habe ich, um herauszufinden, wie Euch meine ausgewählten get-Methode in getValuesAsArray()
.
Irgendwie denke ich, dass mein Ansatz falsch sein kann. Ich bin also offen für Vorschläge.
- Vielleicht bin ich einfach nur ein noob, aber warum müssen Sie passieren eine Methode hier? Was ist das Programm versucht zu erreichen?
- Der eigentliche Datenspeicher wird mehr als 3 Felder. Ich bin, sammeln von Daten, die im dataMap in einer zufälligen Weise. Der Schlüssel der treeMap ist eine spärliche Menge der ganzen zahlen verknüpft, um jeden Datensatz. Irgendwann werde ich brauchen, um abzurufen oder Ausgang der einzelnen Feldwerten wie "sortiert" array, wo die Sortierung erfolgt auf der Basis der Schlüssel ganze zahlen sind.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
getX()
Methoden kann gesehen werden als eine Funktion, die akzeptiert einer DataStore-Instanz und liefert einen float.In Java 8 können Sie stellen Sie Sie mit der Methode Referenzen :
Dann Ihre
getValuesAsArray
akzeptierenFunction<DataStore,Float>
parameter und führen Sie die Funktion aus :Ohne Verwendung von Java 8 Sie können festlegen, Ihre eigene Schnittstelle enthält eine Methode akzeptiert eine
DataStore
Instanz und gibt einenfloat
. Dann, statt mit Java-8-Methode Referenzen, Sie würde zu Durchlaufen haben, um IhregetValuesAsArray
Methode eine Implementierung dieser Schnittstelle (man könnte eine anonyme Klasse, Instanz der Implementierung der Schnittstelle), die Anrufe eines dergetX()
Methoden.Beispiel :
Und
Supplier<T>
erzeugt einen Wert des Typs T, ohne irgendeine Eingabe. Es würde passend sein in dieser Frage, wenn dergetX()
Methoden statisch waren.Sich vor einer Weile habe ich java verwendet.util.gleichzeitige.Aufrufbar, aber es scheint nicht zu funktionieren, Dank an @Eran.
Stattdessen können Sie mit Java 8 ist
java.util.function.Function
, etwa so (ohne die Lambda-Ausdrücke):getA()
,getB()
,getC()
Methoden sind nicht statisch. Sie sollte aufgerufen werden, die für eine bestimmte Instanz von Datenspeicher.Callable
so, dass die Methode aufgerufen werden kann, zu einem späteren Zeitpunkt.DataStore.getA()
wenngetA()
ist statisch, unabhängig davon, ob oder nicht Sie wickeln Sie es mit einer Aufrufbar.MethodReference
ist eine Klasse für Reflexion Zwecke. Ihr code tatsächlich benötigen eine lambda-ähnliche-Objekt, das eine einzelne Methode-Oberfläche in Java 8.Ohne Java 8 oder Reflexion gibt es keine Möglichkeit, directally Ihren Bedarf zu erfüllen wenn. Aber Sie kann immer passieren einige interne Darstellung der Methode, zum anderen calss, und zu tun, so müssen Sie code schreiben, der Prozess dieser internen Darstellung.
Gibt es einen workaround: Scala die java-apis.
Ich benutze Apache Spark und scala bietet eine Reihe von Anonymen Funktionen (Funktion, Function2), die gibt es seit Java 1.5, wenn ich mich nicht Irre (obwohl ich es mit Java 1.7).
Hier ist eine Antwort darüber zu reden. Weil sonst die "Funktion" - Klasse ist erst ab Java 1.8
Können Sie Command Design Pattern
weitere Infos :
https://en.wikipedia.org/wiki/Command_pattern http://www.tutorialspoint.com/design_pattern/command_pattern.htm