方法: 查询出所有部门成员中年龄大于30的员工姓名

部门对象:

员工对象:

模拟数据:

    private static List<Dept> list=new ArrayList<Dept>();
private static List<Employee> listEmpl01=new ArrayList<Employee>();
private static List<Employee> listEmpl02=new ArrayList<Employee>();
static{//初始化数据
Employee employee1=new Employee(1,"张三",25,1);
Employee employee2=new Employee(1,"李四",32,1);
Employee employee3=new Employee(1,"王五",25,1);
Employee employee4=new Employee(1,"赵六",34,2);
Employee employee5=new Employee(1,"周七",43,2);
Employee employee6=new Employee(1,"小明",26,2);
Employee employee7=new Employee(1,"大熊",22,2);
listEmpl01.add(employee1);
listEmpl01.add(employee2);
listEmpl01.add(employee3);
listEmpl02.add(employee4);
listEmpl02.add(employee5);
listEmpl02.add(employee6);
listEmpl02.add(employee7);
Dept dept01=new Dept(1,"研发部",listEmpl01);
Dept dept02=new Dept(2,"人力资源部",listEmpl02);
}

  ok了,如果不使用stream,那么就要使用双重for循环来做了:

    public static void main(String[] args) {
List<String> result = getNameByAge(list);
System.out.println(result);
}
//原始查询方法
public static List<String> getNameByAge(List<Dept> list){
List<String> result=new ArrayList<String>();
for (Dept dept:list) {
List<Employee> employees = dept.getEmployees();
for (Employee employee:employees){
if(employee.getAge()>30){
result.add(employee.getName());
}
}
}
return result;
}

  这也是之前非常普片通用的做法,这种做法其实非常繁琐,可以先去掉for循环:

    //for循环重构
public static List<String> getNameByAgeOne(List<Dept> list){
List<String> result=new ArrayList<String>();
list.forEach(dept->{
dept.getEmployees().forEach(employee->{
if(employee.getAge()>30){
result.add(employee.getName());
}
});
});
return result;
}

  然后接着重构,上面这种明显和没重构之前区别不大:

    //stream重构
public static List<String> getNameByAgeTwo(List<Dept> list){
List<String> result=new ArrayList<String>();
list.stream().forEach(dept->{
dept.getEmployees().stream().filter(employee -> employee.getAge()>30)//使用流过滤
.map(employee->employee.getName()) //挑选出name
.forEach(name->result.add(name));
});
return result;
}

  这里就使用了stream流,先将部门集合转换为流,再进行迭代,取出每一个员工集合,再使用流进行过滤,取name等操作,

但是流中是可以合并流的,即我们完全没必要使用foreach中将每一个员工集合转换成流了,直接使用合并流,而且流可以转换成集合

,这也就意味着可以直接返回流转成的集合了:

    //stream再重构
public static List<String> getNameByAgeFinal(List<Dept> list){
return list.stream().flatMap(dept -> dept.getEmployees().stream())
.filter(employee ->employee.getAge()>30 )
.map(employee -> employee.getName())
.collect(Collectors.toList());
}
}

  直接将流collect(Collectors.toList());返回非常方便,使用flatMap将每个部门的员工集合流合并得到所有员工的流,就可以去掉for循环了,之后再进行操作,这样重构就完美了!!!

最后结果:

效果都是一样的,但是代码看着高大上多了!stream确实非常强大方便!!

最新文章

  1. NSString 的常用操作
  2. C#高级编程笔记 2016年10月8日运算符和类型强制转换
  3. js点击a链接弹出alert对话框
  4. MySQL 5.7贴心参数之binlog_row_image
  5. Apache禁止目录访问的方法
  6. Undokumentierte @Formeln/LotusScript im Lotus Notes Client/Server
  7. 复合事件ready,hover,toggle
  8. android环境搭建——工欲善其事,必先利其器 2
  9. c#文本文件写入
  10. Redundant Call to Object.ToString()
  11. xsank的快餐 » Python simhash算法解决字符串相似问题
  12. UITextField输入长度限制
  13. Jenkins权限配置失误后导致登录失败的解决办法
  14. Python3 的序列
  15. buildbot环境搭建—master篇
  16. js的一些总结
  17. Web API 跨域访问(CORS)
  18. Java 编程下简介 Class 与类加载
  19. mac版 android studio问题解决
  20. .net core 多平台部署

热门文章

  1. Java并发编程实战3-可见性与volatile关键字
  2. DAY...
  3. 远程连接工具SSH和linux的连接
  4. eclispe 出现超内存错误
  5. 【NOI2015】寿司晚宴
  6. 音视频处理之FFmpeg封装格式20180510
  7. 执行composer install后报错:执行composer install后报错: d11wtq/boris v1.0.10 requires ext-pcntl * -&gt; the requested PHP extension pcntl is missing from your system.
  8. python基础1--列表
  9. 总结: 《jQuery基础教程》 5-完结
  10. UITableViewCell的separatorInset属性