stantonk
stantonk

Reputation: 2020

How does Java 8 know which String::compareTo method reference to use when sorting?

How does Java know which String::compareTo method reference to use when calling Collections.sort(someListOfStrings, String::compareTo);? compareTo is not static and it needs to know the value of the "left hand side" of the comparison.

Upvotes: 10

Views: 3360

Answers (2)

Tagir Valeev
Tagir Valeev

Reputation: 100279

Suppose that you use method reference for Comparator interface:

Comparator<String> cmp = String::compareTo;

When you call the cmp.compare(left, right) (which is "single abstract method" or "SAM" of Comparator interface), the magic occurs:

int result = cmp.compare(left, right);
                           |     |
  /------------------------/     |
  |              /---------------/
  |              |
left.compareTo(right);

Basically all the parameters of SAM are converted to the parameters of the referred method, but this object (which is on the left side) is also counted as parameter.

Upvotes: 15

TomS
TomS

Reputation: 1169

OK, the source of Collections.sort() looks as follows:

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]);
   }
}

I think it is quite clear now. The contents is a list. It means it has an order and the items are treated one by one in that order.

Upvotes: 0

Related Questions