Woher weiß Java, welche String::compareTo
Methodenreferenz verwendet werden soll, wenn Collections.sort(someListOfStrings, String::compareTo);
aufgerufen wird? compareTo
ist nicht statisch und es muss die value
der "linken Seite" des Vergleichs kennen.Woher weiß Java 8, welche String :: compareTo Methodenreferenz beim Sortieren verwendet werden soll?
Woher weiß Java 8, welche String :: compareTo Methodenreferenz beim Sortieren verwendet werden soll?
Antwort
Angenommen, Sie Methode Referenz für Comparator
Schnittstelle verwenden:
Comparator<String> cmp = String::compareTo;
Wenn Sie die cmp.compare(left, right)
nennen (die „einzige abstrakte Methode“ oder „SAM“ von Comparator
Schnittstelle ist), tritt die Magie:
int result = cmp.compare(left, right);
| |
/------------------------/ |
| /---------------/
| |
left.compareTo(right);
Grundsätzlich werden alle Parameter von SAM in die Parameter der referenzierten Methode konvertiert, aber this
Objekt (das auf der linken Seite ist) wird auch als Parameter gezählt.
Dies wird als * nicht gebundene Instanz * -Methodenreferenz bezeichnet. –
@Tagir Valeev aber wie passt 'String :: compareTo's Typ' Comparator
@stantonk, denke über 'this' als über einen weiteren Parameter, so' public int compareTo (String anotherString) 'ist wie' public static int compareTo (String this, String anotherString) '. Generell funktioniert es in OOP-Sprachen intern wie folgt: Der Objektzeiger (Referenz) wird in den ersten Parameter der Funktion/Methode konvertiert. –
OK, die Quelle Collections.sort() sieht wie folgt aus:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
}
Ich denke, es ist jetzt ganz klar. Der Inhalt ist eine Liste. Es bedeutet, dass es eine Bestellung hat und die Artikel nacheinander in dieser Reihenfolge behandelt werden.
Entschuldigung, das beantwortet meine Frage nicht. Was ich versuche zu verstehen, ist, wie Java weiß, für jedes Element in der zu sortierenden Liste die richtige 'String :: compareTo'-Methodenreferenz zu verwenden. – stantonk
Also, zum Beispiel, haben Sie eine Liste "[" c "," b "," a "]'. Das erste Element in dieser Liste, "c", ist eine Instanz der Klasse "String", die eine Eigenschaft von "Wert" hat, die ein Zeichen-Array ist, das ein einzelnes Zeichen, "c", enthält. 'compareTo' macht einen Vergleich zwischen" c "und" b "tief innerhalb der" Collections.sort "-Methode, d. h." if (c.compare (a [runHi ++], a [lo]) <0) ". Ich sehe nicht, wie die Methodenreferenz Sie von "Comparable" zu "Comparator" bringt. – stantonk
- 1. Woher weiß CMake, welche Version von Qt verwendet werden soll?
- 2. Woher weiß Swift zur Laufzeit, welche Implementierung verwendet werden soll?
- 3. Java: Woher weiß ich, welche JAR-Datei bei einem Klassennamen verwendet werden soll?
- 4. Woher wissen Sie, welche Art von Konstruktor verwendet werden soll?
- 5. Java 8 verkettete Methodenreferenz?
- 6. Woher weiß Angular 2, woher es importiert werden soll?
- 7. Woher weiß das Betriebssystem, welche Netzwerkschnittstelle für das Internet verwendet werden soll?
- 8. Woher weiß git, welche Datei beim Auschecken geprüft werden soll - somefile?
- 9. Welche Datenstruktur soll verwendet werden?
- 10. Woher weiß ich, welche Pixeldichte-Version eines Bilds Android verwendet?
- 11. Woher weiß C++, welche Methoden eine Vorlagenklasse beim Kompilieren unterstützt?
- 12. Woher weiß man, welche Variable aus Union verwendet wird?
- 13. Woher weiß ich, welche Vorverarbeitung für das Modell verwendet wurde?
- 14. Woher weiß ich, welche serielle Schnittstelle unter Linux verwendet wird?
- 15. Woher weiß ich, wann ein zustandsbasiertes Testen im Vergleich zu einem Scheintest verwendet werden soll?
- 16. Woher weiß Django, welche Migrationen durchgeführt wurden?
- 17. Welche C# -Datenstruktur soll verwendet werden?
- 18. Woher weiß Haskell, welche Typklasseninstanz Sie meinen?
- 19. Woher weiß man, wo AS Schlüsselwort verwendet werden sollte?
- 20. Warum kompiliert diese Java 8 Methodenreferenz?
- 21. Welche Regel-Engine soll verwendet werden?
- 22. Wie AccountManager weiß, welches Google-Konto verwendet werden soll?
- 23. Woher weiß ich, welche OSBundleLibrary bei Verwendung von XCode eingebunden werden soll?
- 24. Java-Sammlungen: Welche Sammlung soll wann verwendet werden?
- 25. Woher weiß NHibernate, in welche Klasseneigenschaften Werte eingefügt werden sollen?
- 26. Welche MediaWiki-API soll verwendet werden?
- 27. Welche Hadoop-Version soll verwendet werden?
- 28. Welche Skalierungsmethode soll vor PCA verwendet werden?
- 29. Welche Diagramm verwendet werden soll Algorithmus Logik
- 30. Woher weiß eine Ansicht, welches Layout verwendet werden soll? Wo ist der Standardwert?
Was ist das? String :: compareTo' –
Ihre Frage ist nicht klar: 'Collections.sort' sortiert die Elemente einer Sammlung,' String :: compareTo' wird verwendet, um zwei Zeichenketten in dieser Sammlung zu vergleichen. Wenn string a
alfasin