方法: 查询出所有部门成员中年龄大于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. 【移动端debug-5】可恶的1px万能实现方案

    最近和设计同学调ui,遇到的是一位对1px有极致追求的同学,像素眼一眼看出我写的是不是1px,所以让我好好地研究了一番1px到底怎么写最方便. 一.为什么出不来1px? 简而言之:css的1px只是一 ...

  2. UVA11624_Fire!

    在一个矩形方阵里面,一个人要从一个位置走向另一个位置,其中某些地方有火源,每过一分钟,火源就会点燃相邻的点,同时相邻的点也变成了火源.人不能通过有火的点.问一个人能够安全地走到目的地去?最短时间多少? ...

  3. [LOJ3049] [十二省联考 2019] 字符串问题

    题目链接 LOJ:https://loj.ac/problem/3049 洛谷:https://www.luogu.org/problemnew/show/P5284 BZOJ:https://www ...

  4. 【Learning】矩阵树定理 Matrix-Tree

    矩阵树定理 Matrix Tree ​ 矩阵树定理主要用于图的生成树计数. 看到给出图求生成树的这类问题就大概要往这方面想了. 算法会根据图构造出一个特殊的基尔霍夫矩阵\(A\),接着根据矩阵树定理, ...

  5. 【ZOJ3899】State Reversing 解题报告

    [ZOJ3899]State Reversing Description 有\(N\)个不同的怪兽,编号从\(1\) 到\(N\).Yukari有\(M\)个相同的房间,编号为\(1\)到\(M\). ...

  6. MyBatis.4关联

    关联.多对一关联查询 package org.mybatis.example.dao; import java.util.Date; //雇员类 public class Emp { private ...

  7. 解题:NOI 2014 购票

    题面 观察一下部分分,我们发现链上的部分分是这样一个DP: $dp[i]=min(dp[i],dp[j]+dis(i,j)*p[i]+q[i])(dis(i,j)<=lim[i]\&\& ...

  8. Jenkins(三)---Jenkins初始配置和插件配置

    从Jenkins(二)中可以知道 jenkins 的工作目录为/opt/jenkins [很重要!!!][很重要!!!][很重要!!!]在配置此目录以前,将这两台的主机进行配置为ssh root用户无 ...

  9. 音视频处理之FFmpeg+SDL+MFC视频播放器20180411

    一.FFmpeg+SDL+MFC视频播放器 1.MFC知识 1).创建MFC工程的方法 打开VC++ 文件->新建->项目->MFC应用程序 应用程序类型->基于对话框 取消勾 ...

  10. 从function的定义看JavaScript的预加载

    在JavaScript中定义一个函数,有两种写法: function ftn(){} // 第一种 var ftn = function(){} // 第二种 有人说,这两种写法是完全等价的.但是在解 ...