W jaki sposób Java wie, które odwołanie metody String::compareTo
użyć do wywoływania Collections.sort(someListOfStrings, String::compareTo);
? compareTo
nie jest statyczny i musi znać value
"lewej strony" porównania.W jaki sposób Java 8 wie, które odwołanie do metody String :: compareTo należy zastosować podczas sortowania?
Odpowiedz
Załóżmy, że używasz Referencyjna metoda dla Comparator
interfejsu:
Comparator<String> cmp = String::compareTo;
Po wywołaniu cmp.compare(left, right)
(który jest "single abstrakcyjny sposób" lub "SAM" z Comparator
Interface), magia następuje:
int result = cmp.compare(left, right);
| |
/------------------------/ |
| /---------------/
| |
left.compareTo(right);
Zasadniczo wszystkie parametry SAM są konwertowane na parametry określonej metody, ale obiekt this
(który znajduje się po lewej stronie) jest również liczony jako parametr.
Nazywa się to odwołaniem do metody * niezwiązanej instancji *. –
@Tagir Valeev, ale jak dopasowuje 'String :: compareTo'' Komparator
@stantonk, pomyśl o 'tym' jako o jeszcze jednym parametrze, więc 'public int compareTo (String anotherString)' jest jak 'public static int compareTo (String this, String anotherString)'. Zwykle w językach OOP wewnętrznie działa w następujący sposób: wskaźnik obiektu (odwołanie) jest konwertowany na pierwszy parametr funkcji/metody. –
OK, źródło Collections.sort() wygląda następująco:
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]);
}
}
myślę, że jest całkiem jasne teraz. Zawartość jest listą. Oznacza to, że ma zamówienie, a produkty są traktowane kolejno w tej kolejności.
Przepraszam, to nie odpowiada na moje pytanie. Próbuję zrozumieć, jak Java wie, aby użyć poprawnego odwołania do metody 'String :: compareTo' dla każdego elementu na liście do posortowania. – stantonk
więc na przykład, powiedzmy, że masz listę '[" c "," b "," a "]'. pierwszy element na tej liście, "c", jest instancją klasy "String", która ma właściwość "wartość", która jest tablicą znaków zawierającą pojedynczy znak "c". 'compareTo' dokonuje porównania pomiędzy" c "i" b "głęboko w metodzie' Collections.sort', np. 'if (c.compare (a [runHi ++], a [lo]) <0)'. Nie widzę, jak odniesienie do metody dostaje cię z "porównywalne" do "komparatora". – stantonk
- 1. Nieznane odwołanie do metody Java 8
- 2. W jaki sposób Grails wie, jak zastosować "układ" do stron, które renderuje?
- 3. W jaki sposób proces node.js wie, kiedy należy zatrzymać?
- 4. W jaki sposób Java wie jak modyfikować tablicę?
- 5. W jaki sposób Chocolatey wie, które pakiety są zainstalowane lokalnie?
- 6. W jaki sposób jądro Linux wie, które sterowniki załadować podczas rozruchu?
- 7. W jaki sposób groovy dodaje nowe metody do klas Java?
- 8. Python odpowiednik Java to compareTo()
- 9. Null bezpieczny komparator daty do sortowania w Javie 8 Stream
- 10. Sortowanie listy alfabetycznie za pomocą metody compareTo()
- 11. Czy Java 8 może implementować interfejs w locie, aby uzyskać odwołanie do metody?
- 12. Java: null safe compareTo method
- 13. Java filtr 8 map i sortowania
- 14. Java - compareTo i operatorzy
- 15. W jaki sposób zaimplementowano metodę String # # języka Java?
- 16. W jaki sposób git-svn wie, do której gałęzi należy dcommit?
- 17. W jaki sposób linker C++ wie, które .lib zawiera które funkcje?
- 18. Java nie autoboxing dla int dla metody compareTo?
- 19. Wyrażenie lambda lub odwołanie do metody?
- 20. Jak zastosować listę funkcji do wartości w Java 8?
- 21. W jaki sposób bios wie, jaki rodzaj BPB jest obecny?
- 22. Java HashMap sortowania według wartości
- 23. Czy ktoś wie, które metody są nieaktualne w IOS 6.0?
- 24. Zapisywanie metody w zmiennej, java 8
- 25. C#: W jaki sposób należy zaimplementować ToString()?
- 26. java 8 Collector <String, A, R> nie jest interfejsem funkcjonalnym, kto wie dlaczego?
- 27. Należy zastosować odziedziczoną metodę abstrakcyjną
- 28. W jaki sposób Java obsługuje pola podczas upcastingu?
- 29. W jaki sposób Spark osiąga kolejność sortowania?
- 30. W jaki sposób C# wie, jaki jest typ literału?
co to jest 'String :: compareTo' –
Twoje pytanie nie jest jasne:' Collections.sort' sortuje elementy kolekcji, 'String :: compareTo 'służy do porównywania dwóch ciągów w tej kolekcji. jeśli string a
alfasin