Java如何按多个字段对对象流进行排序
on  It Road.com

Java 对流的多个字段进行排序

使用 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, "JackLi", "Gupta") );
		list.add( new Employee(1l, "JackLi", "Gussin") );
		list.add( new Employee(4l, "BobRobert", "Sux") );
		list.add( new Employee(5l, "Neon", "Piper") );
		list.add( new Employee(3l, "Tomm", "Beckham") );
		list.add( new Employee(7l, "JackLi", "Beckham") );
		list.add( new Employee(6l, "BobRobert", "Suxena") );
        return list;
	}
}

为多个字段创建比较器

要对多个字段进行排序,我们必须首先为要对流进行排序的每个字段创建比较器。
然后按所需顺序链接每个比较器,以按对完整排序的影响进行分组。

//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();
日期:2020-09-17 00:09:27 来源:oir作者:oir