Kontrakt metody Arrays.sort() mowi tak:
-
daj mi w pierwszym parametrze tablice
-
daj mi w drugim parameterze jakąś informację, jak mam posortowac ci tą tablice.
-
Jest zrealizowane w taki sposob, ze argument ten ma byc obiektem implementujacym interfejs Comparator.
Interfejs Comparator ma jedna metode
int compare(T o1, T o2);
Kontrakt tej metody mowi jasno:
/**
* Compares its two arguments for order. Returns a negative integer,
* zero, or a positive integer as the first argument is less than, equal
* to, or greater than the second.<p>
.......
Jako, ze Java pozwala na definiowanie klas anonimowych, twoj przyklad mozna zapisac tak. (w wersji sprzed javy 8)
Arrays.sort(mass, new Comparator<String>() {
@Override
public int compare(String first, String second) {
return first.length()-second.length();
}
});
A to po prostu mowi, ze ma byc tablica Stringow ma byc posortowana wedlug ich dlugosci.
Java 8 wprowadzila lambdy i interfejsy funkcyjne. W szczegolnosci funkcyjne interfejsy (czyli takie, ktore maja jedna abstrakcyjna metoda wymagana do zaimplementowania) mozna przeksztalcic w lambde. Lambda to nic innego jak lukier syntaktyczny na obiekt klasy anonimowej implementujacy interfejs, ktory zastepuje.
Tak wiec zwiezlejszym zapisem tego
new Comparator<String>() {
@Override
public int compare(String first, String second) {
return first.length()-second.length();
}
}
jest to
(first, second) -> first.length()-second.length()
Porownaj sobie oba snippet'y i zobacz, ktore elementy zostaly usuniete, a ktore odpowiadaja tym z dluzszej wersji powyzej.
Nie musisz podawac typow dla zmiennych first i second w danej lambdzie, dlatego ze do jezyka weszlo tez inferencja typow (type inference) i kompilator jest w stanie stwierdzic, ze skoro tablica jest tablica Stringow, to first i second ma byc typu string.
Sama implementacja funkcji sort jest malo istotna. Ta funkcja przejdzie ci po calej tablicy i w odpowiedni sposob ci ja posortuje, ty musisz tylko powiedziec jej, wedlug jakiego kryterium. Tym kryterium tutaj jest dlugosc Stringow a forma w jaka ta funkcje informujesz, jest poprzez powiedzenie jej, ktory element jest mniejszy/wiekszy/czy sa rowne jesli natrafi na dwa obiekty typu String. Funkcja sort jest przykladem funcji wyzszego rzedu (higher order function).