引言
在java编程方法中最常用到的进行排序操作的集合结构应该就是数组和列表两种,各种数据结构排序算法也是基于数组来的,而列表自带的排序功能也提供了很大的方便,但在进行多线程并行排序时,这两种数据结构就显得有些乏力,今天我们就尝试使用一种新型的Stream流式结构对雇员(Employee类)中先按照性别进行筛选然后再按照入职日期进行排序。
功能实现
1、类的设计
Employee类共三个字段:department,name,sex,age,entired
private int department;
private String name;
private String sex;
private int age;
private Date ensired;
2、创建对象实例
这里department,name,sex,age,entired这五个字段我们通过人工创建的形式进行赋值,其中entired的创建我们利用Date.valueOf(LocalDate.of(year,month,day).plus(||minus)Days(days))的方式j进行。
LocalDate ld=LocalDate.of(2021,1,1);
Employee e = new Employee(1, "cong", "male", 23, Date.valueOf(ld));
Employee e2 = new Employee(2, "li", "female", 33, Date.valueOf(ld.plusDays(1)));
Employee e3 = new Employee(3, "zhang", "male", 33, Date.valueOf(ld.minusDays(2)));
Employee e4 = new Employee(4, "wang", "female", 44, Date.valueOf(ld.minusDays(4)));
Employee e5 = new Employee(5, "liu", "male", 55, Date.valueOf(ld.plusDays(5)));```
3、利用Stream流式计算对于男性雇员按照entired日期字段进行排序。
如果使用List或者数组等其他数据结构,需要先对集合元素进行过滤,然后再进行排序,可以说比较复杂,同时也不支持多线程并发执行。而使用Stream则只需要一个语句即可得到所求结果:
List<Employee> se = Arrays.asList(e, e2, e3, e4, e5).stream().filter((m) -> {
return m.getSex().contentEquals("male");
}).sorted(Comparator.comparing((c1) -> {
return c1.getEnsired();
})).collect(Collectors.toList());
filter
是流的中间方法,结果为一个经过过滤的Stream,此方法接受 Predicate<? super T> predicate
函数式接口作为入参,可以利用lambda表达式直接创建一个能返回boolean型变量的方法。
sorted
是中间方法,此方法接受一个Comparator
接口对象,对Stream中的每一个对象按照Comparator自定义的比较方法进行比较。具体的比较规则我们使用Comparator.comparing(Function<? super T,? extends U)
进行设定,这里的泛型U是返回类型,这个类型必须是实现了Comparable的可比较类。
collect(Collector)
是一个结束方法,将流中的数据按照可选择的集合类型归约到一起。这里为了方便显示最终结果,我们选择了具有顺序特征的List作为最终结果的保存集合。
总结
这个小程序实现的功能非常简单,即将雇员先过滤再排序,但其具体实现过程是可以多线程并发:将stream通过parallel()
方法设置为并行流即可。同时语法也很简洁。日期类型为方便数据库操作,使用了sql包下的Date类,该类对象可以通过Date.valueOf(LocalDate)方法快速获取,比util下的Date类型方便不少。