利用流式计算对男性员工按入职日期进行排序

引言

在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类型方便不少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值