学习使用 Comparators 和 Comparator.thenComparing()
方法按多个字段对对象流进行排序。此方法返回一个带有另一个比较器的lexicographic-order 比较器。它提供与 SQL GROUP BY 子句相同的效果。
要对多个字段进行排序,我们必须首先为要对流项目进行排序的每个字段创建简单的比较器。然后,我们以所需的顺序链接这些比较器实例,使 GROUP BY 对完整的排序行为产生影响。
请注意,Comparator 提供了一些其他方法,如果它们符合要求,我们可以使用它们。
//first name comparator
Comparator<Employee> compareByFirstName = Comparator.comparing( Employee::getFirstName );
//last name comparator
Comparator<Employee> compareByLastName = Comparator.comparing( Employee::getLastName );
//Compare by first name and then last name (multiple fields)
Comparator<Employee> compareByFullName = compareByFirstName.thenComparing(compareByLastName);
//Using Comparator - pseudo code
list.stream().sorted( comparator ).collect();
下面给出的是使用 thenComparing()
创建 Comparator
的示例,它能够按员工的名字 和姓氏。
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
ArrayList<Employee> employees = getUnsortedEmployeeList();
//Compare by first name and then last name
Comparator<Employee> compareByName = Comparator
.comparing(Employee::getFirstName)
.thenComparing(Employee::getLastName);
List<Employee> sortedEmployees = employees.stream()
.sorted(compareByName)
.collect(Collectors.toList());
System.out.println(sortedEmployees);
}
private static ArrayList<Employee> getUnsortedEmployeeList()
{
ArrayList<Employee> list = new ArrayList<>();
list.add( new Employee(2l, "Lokesh", "Gupta") );
list.add( new Employee(1l, "Alex", "Gussin") );
list.add( new Employee(4l, "Brian", "Sux") );
list.add( new Employee(5l, "Neon", "Piper") );
list.add( new Employee(3l, "David", "Beckham") );
list.add( new Employee(7l, "Alex", "Beckham") );
list.add( new Employee(6l, "Brian", "Suxena") );
return list;
}
}
程序输出。
[E[id=7, firstName=Alex, lastName=Beckham],
E [id=1, firstName=Alex, lastName=Gussin],
E [id=4, firstName=Brian, lastName=Sux],
E [id=6, firstName=Brian, lastName=Suxena],
E [id=3, firstName=David, lastName=Beckham],
E [id=2, firstName=Lokesh, lastName=Gupta],
E [id=5, firstName=Neon, lastName=Piper]]
类似于链式谓词,我们可以组合任意数量的比较器来创建任何复杂的排序逻辑并使用它对Stream 项进行排序。
我们可以使用其他 Comparator 方法以及 官方 Java 文档。
快乐学习!!
地址:https://www.cundage.com/article/sort-stream-multiple-fields.html