方法: 查询出所有部门成员中年龄大于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确实非常强大方便!!

使用java8的StreamAPI对集合计算进行代码重构的更多相关文章

  1. Java8新增的这些集合骚操作,你掌握了嘛?

    目录 Iterable的forEach Iterator的forEachRemaining Collection的removeIf Stream操作 List的replaceAll List的sort ...

  2. Java8 新特性之集合操作Stream

    Java8 新特性之集合操作Stream Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同 ...

  3. [Java8教程]Java8新特性进阶集合

    Java8新特性进阶集合 基于 AOP 抽离方法的重复代码 Java8:当 Lambda 遇上受检异常 Java8:对字符串连接的改进 Java8:Java8 中 Map 接口的新方法 Java8:当 ...

  4. C++算法之大数加法计算的代码

    如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...

  5. 一些日常工具集合(C++代码片段)

    一些日常工具集合(C++代码片段) ——工欲善其事,必先利其器 尽管不会松松松,但是至少维持一个比较小的常数还是比较好的 在此之前依然要保证算法的正确性以及代码的可写性 本文依然会持久更新,因为一次写 ...

  6. Javascript时间差计算函数代码实例

    Javascript时间差计算函数代码实例 <script language="javascript"> Date.prototype.dateDiff = funct ...

  7. 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)

    近期在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作.仅仅是出现 ...

  8. 关于UDP的检验和计算(附代码)

    关于UDP的检验和计算(附代码) 在下午的学习过程中https://www.cnblogs.com/roccoshi/p/13032356.html 有一张图讲述了UDP的校验方法, 如下: 老师只粗 ...

  9. 网络模型mAP计算实现代码

    网络模型mAP计算实现代码 一.mAP精度计算 这里首先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,计为正例(positive)和负例(negtive)分别是: 1)True posi ...

随机推荐

  1. 【刷题】BZOJ 3295 [Cqoi2011]动态逆序对

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  2. 【hdu4057】 恨7不成妻

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 (题目链接) 题意 求区间${[a,b]}$中的某些数的平方和,这些数要满足1.不是7的倍数,2.不含有7 ...

  3. 解题:USACO13NOV Empty Stalls

    题面 当然可以用并查集做,不过你需要按秩合并+路径压缩(才可能过),因为数据范围十分不友好...... USACO的官方做法更为优秀.首先题目告诉我们牛们加入的前后顺序不影响结果(自己证明也很容易,显 ...

  4. Redis学习基础二

    回顾:上一基础中已了解 ( 什么是redis .redis 的三大特点.安装,和数据配置) 接下来浅尝Redis的数据类型,时间煮雨...... 一.Redis数据类型 redis支持五中数据类型(s ...

  5. 在Struts2的Action中获得request response session几种方法

    转载自~ 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象呢?Struts2为我们提供了四种方式.分别为se ...

  6. Gym 101933

    Gym 101933 B. Baby Bites水题直接模拟即可 #include <cstdio> #include <cstring> #include <queue ...

  7. 在VC6/VC2005下使程序直接具有XP风格(XP Style):

    原文 首先将以下文本保存为XpStyle.mainfest(后经实践,文件名和后缀是什么都无所谓) <?xml version="1.0" encoding="UT ...

  8. Showbo.js弹窗实现(jquery)

    一.搭建环境 下载showBo.js和showBo.css 下载链接:https://pan.baidu.com/s/1iUUlKXFNXCBEvBnds4ECIA  密码:its4 显示效果图: 二 ...

  9. 转:UINavigationBar返回上一级出现nested pop animation can result in corrupted navigation bar

    [self.navigationController popViewControllerAnimated:NO]; 出现上面的错误是因为pop的时候要确保先让本页面加载完成,即如果在viewDidLo ...

  10. textview 使drawable与text一起居中的textview,这里仅支持drawableleft

    package cc.hent.www.ramo_cmedcial.CustomView; import android.content.Context; import android.graphic ...