leftso 1815 1 2019-07-08 15:00:47

文章位置:左搜> 编程技术> 正文
本例子主要使用stream进行多个字段的排序,使用了 comparators和Comparator.thenComparing()方法。比较器之间返回一个字典排序。他的排序效果有点像SQL中的group by条件。

1.创建一个多字段排序的比较器

想要使用Java 8的Stream进行多字段排序,首先我们需要对我们想要排序的字段及那些创建comparator。然后根据需求进行一个链式的排序顺序,以此来完成类似group by的排序效果。

如何创建比较器comparator:
//姓的比较器comparator
Comparator<Employee> compareByFirstName = Comparator.comparing( Employee::getFirstName );
 
//最后一个名字的比较器 comparator
Comparator<Employee> compareByLastName = Comparator.comparing( Employee::getLastName );
 
//比较第一个名字然后比较最后一个名字 (多字段)
Comparator<Employee> compareByFullName = compareByFirstName.thenComparing(compareByLastName);
 
//使用比较器Comparator - 伪代码
list.stream().sorted( comparator ).collect();

2. java 8 stream 多字段排序

排序例子:
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();
         
        //先比较姓然后比较名
        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;
    }
}

运行项目输出结果:
$title(Console)
[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]]

上方输出结果表示已经实现多字段的字典排序,如果你有任何疑问欢迎在下面的评论区留言告诉我。ok