使用java8的StreamAPI对集合计算进行代码重构
方法: 查询出所有部门成员中年龄大于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对集合计算进行代码重构的更多相关文章
- Java8新增的这些集合骚操作,你掌握了嘛?
目录 Iterable的forEach Iterator的forEachRemaining Collection的removeIf Stream操作 List的replaceAll List的sort ...
- Java8 新特性之集合操作Stream
Java8 新特性之集合操作Stream Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同 ...
- [Java8教程]Java8新特性进阶集合
Java8新特性进阶集合 基于 AOP 抽离方法的重复代码 Java8:当 Lambda 遇上受检异常 Java8:对字符串连接的改进 Java8:Java8 中 Map 接口的新方法 Java8:当 ...
- C++算法之大数加法计算的代码
如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...
- 一些日常工具集合(C++代码片段)
一些日常工具集合(C++代码片段) ——工欲善其事,必先利其器 尽管不会松松松,但是至少维持一个比较小的常数还是比较好的 在此之前依然要保证算法的正确性以及代码的可写性 本文依然会持久更新,因为一次写 ...
- Javascript时间差计算函数代码实例
Javascript时间差计算函数代码实例 <script language="javascript"> Date.prototype.dateDiff = funct ...
- 基于ACCESS和ASP的SQL多个表查询与计算统计代码(一)
近期在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作.仅仅是出现 ...
- 关于UDP的检验和计算(附代码)
关于UDP的检验和计算(附代码) 在下午的学习过程中https://www.cnblogs.com/roccoshi/p/13032356.html 有一张图讲述了UDP的校验方法, 如下: 老师只粗 ...
- 网络模型mAP计算实现代码
网络模型mAP计算实现代码 一.mAP精度计算 这里首先介绍几个常见的模型评价术语,现在假设我们的分类目标只有两类,计为正例(positive)和负例(negtive)分别是: 1)True posi ...
随机推荐
- 【NOI】荷马史诗
追逐影子的人,自己就是影子 ——荷马 Allison最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和< ...
- Mac OS 装gdb
1 要求按照mac ports 2 命令:sudo port install gdb 3 安装位置在: /opt/local/bin/ggdb , 注意,ggdb是执行命令
- OCR论文整理
论文地址:https://github.com/ChanChiChoi/awesome-ocr 下面是已经看过的论文: CTPN CRNN TextBoxes EAST FOTS PixelLink
- 我们使用git checkout 将B分支上的部分页面代码 添加或覆盖到A分支上
$ git branch * A B $ git checkout B message.html message.css message.js other.js $ git status # On b ...
- servlet拦截器
servlet拦截未登录的用户请求 java代码: package com.gavin.filter; import java.io.IOException; import javax.servlet ...
- ElastAlert规则
elastalert 是一款基于elasticsearch的开源告警产品(官方说明文档).相信许多人都会使用ELK做日志收集系统,但是产生一个基于日志的“优秀”的安全告警确是一个难题.告警规则难编写, ...
- git爬坑不完全指北(二):failed to push some refs to ‘XXX’的解决方案
报错分析 从字面理解,这个报错的意思就是说远程仓库里有一个改动是本地仓库里没有的,所以在push前要先把远程仓库上的改动pull或者fetch到本地仓库.然后再执行push的操作,把本地 ...
- 修改home下的中文目录为英文目录
原文地址:http://blog.csdn.net/esonbest1234/article/details/50729582 习惯问题,喜欢使用fedora为您在home目录下自创建的“桌面”.“文 ...
- LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵
https://loj.ac/problem/6030 如果矩阵第i列有一个黑色, 那可以用他把第i行全都染黑,也可以使任意一列具有黑色 然后就可以用第i行把矩阵染黑 染黑一列的代价最少是1 染黑一行 ...
- CS20 D LCA
给出一棵树,许多询问,每次询问A,B,C三点,求一点使到三点距离最小,输出该点和最小值. 很明显就是求LCA,三种组合都求一次LCA,然后在里面选个距离和最小的就行了. 官方题解里面的代码求LCA是在 ...