Chapter 4. Comparators and Collectors
Java 8 enhances the Comparator interface with several static and default methods that make sorting operations much simpler. It’s now possible to sort a collection of POJOs by one property, then equal first properties by a second, then by a third, and so on, just with a series of library calls.
Java 8 also adds a new utility class called java.util.stream.Collectors, which provides static methods to convert from streams back into various types of collections. The collectors can also be applied “downstream,” meaning that they can postprocess a grouping or partitioning operation.
The recipes in this chapter illustrate all these concepts.
4.1 Sorting Using a Comparator
Problem
You want to sort objects.
Solution
Use the sorted method on Stream with a Comparator, either implemented with a lambda expression or generated by one of the static compare methods on the Comparator interface.
Discussion
The sorted method on Stream produces a new, sorted stream using the natural ordering for the class. The natural ordering is specified by implementing the java.util.Comparable interface.
For example, consider sorting a collection of strings, as shown in Example 4-1.
Example 4-1. Sorting strings lexicographically
privateList<String>sampleStrings=Arrays.asList("this","is","a","list","of","strings");publicList<String>defaultSort(){Collections.sort(sampleStrings);returnsampleStrings;}publicList<String>defaultSortUsingStreams(