使用java8的StreamAPI对集合计算进行代码重构
2024-10-21 04:02:21
方法: 查询出所有部门成员中年龄大于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确实非常强大方便!!
最新文章
- NSString 的常用操作
- C#高级编程笔记 2016年10月8日运算符和类型强制转换
- js点击a链接弹出alert对话框
- MySQL 5.7贴心参数之binlog_row_image
- Apache禁止目录访问的方法
- Undokumentierte @Formeln/LotusScript im Lotus Notes Client/Server
- 复合事件ready,hover,toggle
- android环境搭建——工欲善其事,必先利其器 2
- c#文本文件写入
- Redundant Call to Object.ToString()
- xsank的快餐 » Python simhash算法解决字符串相似问题
- UITextField输入长度限制
- Jenkins权限配置失误后导致登录失败的解决办法
- Python3 的序列
- buildbot环境搭建—master篇
- js的一些总结
- Web API 跨域访问(CORS)
- Java 编程下简介 Class 与类加载
- mac版 android studio问题解决
- .net core 多平台部署
热门文章
- Java并发编程实战3-可见性与volatile关键字
- DAY...
- 远程连接工具SSH和linux的连接
- eclispe 出现超内存错误
- 【NOI2015】寿司晚宴
- 音视频处理之FFmpeg封装格式20180510
- 执行composer install后报错:执行composer install后报错: d11wtq/boris v1.0.10 requires ext-pcntl * ->; the requested PHP extension pcntl is missing from your system.
- python基础1--列表
- 总结: 《jQuery基础教程》 5-完结
- UITableViewCell的separatorInset属性