1. Classic Comparator example.
Comparator byName = new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {returno1.getName().compareTo(o2.getName());
}
};
Copy2. Lambda expression equivalent.
Comparator byName =(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
Copy1. Sort without Lambda
Example to compare the Developer objects using their age. Normally, you use Collections.sort and pass an anonymous Comparatorclass like this:
TestSorting.javapackagecom.mkyong.java8;importjava.math.BigDecimal;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;public classTestSorting {public static voidmain(String[] args) {
List listDevs =getDevelopers();
System.out.println("Before Sort");for(Developer developer : listDevs) {
System.out.println(developer);
}//sort by age
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {return o1.getAge() -o2.getAge();
}
});
System.out.println("After Sort");for(Developer developer : listDevs) {
System.out.println(developer);
}
}private static ListgetDevelopers() {
List result = new ArrayList();
result.add(new Developer("mkyong", new BigDecimal("70000"), 33));
result.add(new Developer("alvin", new BigDecimal("80000"), 20));
result.add(new Developer("jason", new BigDecimal("100000"), 10));
result.add(new Developer("iris", new BigDecimal("170000"), 55));returnresult;
}
}
Copy
Output
Before Sort
Developer [name=mkyong, salary=70000, age=33]
Developer [name=alvin, salary=80000, age=20]
Developer [name=jason, salary=100000, age=10]
Developer [name=iris, salary=170000, age=55]
After Sort
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=mkyong, salary=70000, age=33]
Developer [name=iris, salary=170000, age=55]
Copy
When the sorting requirement is changed, you just pass in anothernew anonymous Comparator class://sort by age
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {return o1.getAge() -o2.getAge();
}
});//sort by name
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {returno1.getName().compareTo(o2.getName());
}
});//sort by salary
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {returno1.getSalary().compareTo(o2.getSalary());
}
});
Copy
It works, but,do you think it is a bit weird to create a class just because you want to change a single line of code?
2. Sort with Lambda
In Java8, the List interfaceis supports the sort method directly, no need to use Collections.sort anymore.//List.sort() since Java 8
listDevs.sort(new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {return o2.getAge() -o1.getAge();
}
});
Copy
Lambda expression example :
TestSorting.javapackagecom.mkyong.java8;importjava.math.BigDecimal;importjava.util.ArrayList;importjava.util.List;public classTestSorting {public static voidmain(String[] args) {
List listDevs =getDevelopers();
System.out.println("Before Sort");for(Developer developer : listDevs) {
System.out.println(developer);
}
System.out.println("After Sort");//lambda here!
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());//java 8 only, lambda also, to print the List
listDevs.forEach((developer)->System.out.println(developer));
}private static ListgetDevelopers() {
List result = new ArrayList();
result.add(new Developer("mkyong", new BigDecimal("70000"), 33));
result.add(new Developer("alvin", new BigDecimal("80000"), 20));
result.add(new Developer("jason", new BigDecimal("100000"), 10));
result.add(new Developer("iris", new BigDecimal("170000"), 55));returnresult;
}
}
Copy
Output
Before Sort
Developer [name=mkyong, salary=70000, age=33]
Developer [name=alvin, salary=80000, age=20]
Developer [name=jason, salary=100000, age=10]
Developer [name=iris, salary=170000, age=55]
After Sort
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=mkyong, salary=70000, age=33]
Developer [name=iris, salary=170000, age=55]
Copy3. More Lambda Examples3.1Sort By age//sort by age
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {return o1.getAge() -o2.getAge();
}
});//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());//lambda, valid, parameter type is optional
listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());
Copy3.2Sort by name//sort by name
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {returno1.getName().compareTo(o2.getName());
}
});//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName()));//lambda
listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));
Copy3.3Sort by salary//sort by salary
Collections.sort(listDevs, new Comparator() {
@Overridepublic intcompare(Developer o1, Developer o2) {returno1.getSalary().compareTo(o2.getSalary());
}
});//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getSalary().compareTo(o2.getSalary()));//lambda
listDevs.sort((o1, o2)->o1.getSalary().compareTo(o2.getSalary()));
Copy3.4Reversed sorting.3.4.1Lambda expression to sort a List using their salary.
Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
listDevs.sort(salaryComparator);
Copy
Output
Developer [name=mkyong, salary=70000, age=33]
Developer [name=alvin, salary=80000, age=20]
Developer [name=jason, salary=100000, age=10]
Developer [name=iris, salary=170000, age=55]
Copy3.4.2Lambda expression to sort a List using their salary, reversed order.
Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
listDevs.sort(salaryComparator.reversed());
Copy
Output
Developer [name=iris, salary=170000, age=55]
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=mkyong, salary=70000, age=33]