Die vorherigen Antworten sind ziemlich vollständig, was die ::
Methodenreferenz tut. Zusammenfassend ermöglicht es eine Möglichkeit, auf eine Methode (oder Konstruktor) zu verweisen, ohne sie auszuführen, und wenn es ausgewertet wird, erstellt es eine Instanz des funktionalen Interfaces, das den Zieltypkontext bereitstellt.
Im Folgenden sind zwei Beispiele zur Suche nach einem Objekt mit dem maximalen Wert in einem ArrayList
mit und ohne der Verwendung von ::
Methodenreferenz. Erläuterungen finden Sie in den Kommentaren unten.
Ohne die Verwendung von ::
import java.util.*;
class MyClass {
private int val;
MyClass (int v) { val = v; }
int getVal() { return val; }
}
class ByVal implements Comparator {
// bei Verwendung der Methodenreferenz muss diese Klasse nicht erstellt werden
public int compare(MyClass source, MyClass ref) {
return source.getVal() - ref.getVal();
}
}
public class FindMaxInCol {
public static void main(String args[]) {
ArrayList myClassList = new ArrayList();
myClassList.add(new MyClass(1));
myClassList.add(new MyClass(0));
myClassList.add(new MyClass(3));
myClassList.add(new MyClass(6));
MyClass maxValObj = Collections.max(myClassList, new ByVal());
}
}
Mit der Verwendung von ::
import java.util.*;
class MyClass {
private int val;
MyClass (int v) { val = v; }
int getVal() { return val; }
}
public class FindMaxInCol {
static int compareMyClass(MyClass source, MyClass ref) {
// Diese statische Methode ist mit der compare() Methode, die von Comparator definiert ist, kompatibel.
// Daher ist es nicht notwendig, Comparator explizit zu implementieren und eine Instanz wie im ersten Beispiel zu erstellen.
return source.getVal() - ref.getVal();
}
public static void main(String args[]) {
ArrayList myClassList = new ArrayList();
myClassList.add(new MyClass(1));
myClassList.add(new MyClass(0));
myClassList.add(new MyClass(3));
myClassList.add(new MyClass(6));
MyClass maxValObj = Collections.max(myClassList, FindMaxInCol::compareMyClass);
}
}