This post shows how you can use Java 8 lambda expressions and method references to sort a list of Person
objects by age. In Java 8, the List
interface has a sort
method, which expects a Comparator
to compare two objects.
Traditionally, you would either sort a list by creating a specific class that implements the Comparator
interface, like this:
public class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
}
list.sort(new AgeComparator());
or, you would use an anonymous class, like this:
list.sort(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
});
As you can see, this is quite verbose!
Java 8 introduces lambda expressions, which allow you to pass code more concisely. Since Comparator
is a functional interface, you can use a lambda expression to sort the list:
list.sort((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));
You may have noticed that the Comparator
class has a static method called comparingInt
that takes a ToIntFunction
and returns a Comparator
object. So, we can rewrite the code above to:
import static java.util.Comparator.comparingInt;
list.sort(comparingInt(p -> p.getAge()));
Finally, we can improve our code even further by using a method reference, which is just "syntactic sugar" for a lambda expression:
list.sort(comparingInt(Person::getAge));
The final solution is not only shorter but is also easier to read :)