1. Introduction
In this tutorial, we’ll discuss ways to sort stream with the help of examples. Stream
interface provides following overloaded sorted()
methods:
Stream sorted()
Stream sorted(Comparator comparator)
2. Sort a list of integers
You can use the sorted()
method to sort the list in the ascending order.
List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList());
Complete example
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class SortStreamExample { public static void main(final String[] arguments) { // create list List<Integer> list = Arrays.asList(9, 5, 7, 2, 8, 4, 3, 6, 1); // sort the list List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList()); // print the list sortedList.forEach(System.out::println); } }
Output
1 2 3 4 5 6 7 8 9
3. Sort a list of integers in descending order
You can pass the Comparator.reverseOrder()
to the sorted()
method of Stream
.
List<Integer> sortedList = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class SortStreamExample { public static void main(final String[] arguments) { // create list List<Integer> list = Arrays.asList(9, 5, 7, 2, 8, 4, 3, 6, 1); List<Integer> sortedList = list.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList()); // print the list sortedList.forEach(System.out::println); } }
Output
9 8 7 6 5 4 3 2 1
4. Sort list of objects
Consider a list of Employee
objects. Employee
object has name and salary as fields. We’ll sort the list of Employee
objects by comparing salary field in ascending and descending order.
Following is the Employee object:
public class Employee { String name; int salary; public Employee(String name, int salary) { super(); this.name = name; this.salary = salary; } // getter, setter, toString() removed from brevity }
The sorted()
method accepts a Comparator
as an argument. You can pass lambda expression to the sorted()
method.
List<Employee> sortedList = list.stream().sorted((emp1, emp2) -> emp1.getSalary() - emp2.getSalary()) .collect(Collectors.toList());
You can also use Comparator.comparingInt()
method in our case to compare salaries as salary is an integer.
List<Employee> sortedList = list.stream().sorted(Comparator.comparingInt(Employee::getSalary)) .collect(Collectors.toList());
Complete example
import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class SortStreamExample { public static void main(final String[] arguments) { // create list List<Employee> list = new ArrayList(); Employee employee1 = new Employee("Mat", 1000); Employee employee2 = new Employee("James", 1700); Employee employee3 = new Employee("Anna", 2300); Employee employee4 = new Employee("Kevin", 1900); Employee employee5 = new Employee("Julie", 1500); list.add(employee1); list.add(employee2); list.add(employee3); list.add(employee4); list.add(employee5); // using lambda List<Employee> sortedList1 = list.stream().sorted((emp1, emp2) -> emp1.getSalary() - emp2.getSalary()) .collect(Collectors.toList()); // Comparator.comparingInt() List<Employee> sortedList2 = list.stream().sorted(Comparator.comparingInt(Employee::getSalary)) .collect(Collectors.toList()); // print the list sortedList1.forEach(System.out::println); sortedList2.forEach(System.out::println); } }
Output
Employee [name=Mat, salary=1000] Employee [name=Julie, salary=1500] Employee [name=James, salary=1700] Employee [name=Kevin, salary=1900] Employee [name=Anna, salary=2300] Employee [name=Mat, salary=1000] Employee [name=Julie, salary=1500] Employee [name=James, salary=1700] Employee [name=Kevin, salary=1900] Employee [name=Anna, salary=2300]
4.1 Sort list of objects in reverse order
You can use the reversed()
method to get the result in reverse order.
List<Employee> sortedList = list.stream().sorted(Comparator.comparingInt(Employee::getSalary).reversed()) .collect(Collectors.toList());
4.2 Sort by name
List<Employee> sortedList = list.stream().sorted(Comparator.comparing(Employee::getName)) .collect(Collectors.toList());
5. Custom sort
We can create a custom Comparator and pass to the sorted() method. We’ll create a custom Comparator just for demonstration.
import java.util.Comparator; public class FirstNameSorter implements Comparator<Employee> { @Override public int compare(Employee emp1, Employee emp2) { return emp2.getName().compareToIgnoreCase(emp1.getName()); } }
You can pass the Comparator
to the sorted()
method.
// using lambda List<Employee> sortedList = list.stream().sorted(new FirstNameSorter()).collect(Collectors.toList());
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class SortStreamExample { public static void main(final String[] arguments) { // create list List<Employee> list = new ArrayList(); Employee employee1 = new Employee("Mat", 1000); Employee employee2 = new Employee("James", 1700); Employee employee3 = new Employee("Anna", 2300); Employee employee4 = new Employee("Kevin", 1900); Employee employee5 = new Employee("Julie", 1500); list.add(employee1); list.add(employee2); list.add(employee3); list.add(employee4); list.add(employee5); // using lambda List<Employee> sortedList = list.stream().sorted(new FirstNameSorter()).collect(Collectors.toList()); // print the list sortedList.forEach(System.out::println); } }
Output
Employee [name=Mat, salary=1000] Employee [name=Kevin, salary=1900] Employee [name=Julie, salary=1500] Employee [name=James, salary=1700] Employee [name=Anna, salary=2300]