2015-09-05 16 views
9

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?

+0

co to jest 'String :: compareTo' –

+0

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

Odpowiedz

11

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.

+7

Nazywa się to odwołaniem do metody * niezwiązanej instancji *. –

+0

@Tagir Valeev, ale jak dopasowuje 'String :: compareTo'' Komparator '? Sygnatura typu nie pasuje ... Metoda 'compare'' String 'to' public int compareTo (String innyString) ',' Komparator 'to' int porównać (String o1, String o2); 'Wiem, że ja brakuje mi czegoś, czego nie potrafię połączyć z kropkami. – stantonk

+2

@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. –

0

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.

+0

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

+0

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

Powiązane problemy