1

简介

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

熟悉Linux的同学对这种风格一定不陌生,因为它跟Linux的|管道符的思想如出一辙。上面这段话引用自runoob.com,但是其教学代码都是基于String列表进行演示,考虑到实际情况百分之80的时候都是对PO、VO进行处理,因此以下通过一个PO进行讲解。

对比起for循环操作list,最大的弊端就是代码太长太乱了,如果涉及3-4张表的操作,也就是涉及多个PO操作,那个括号简直就是俄罗斯套娃,写到最后真的自己都不知道在写什么。

2

+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+

PO代码

public class UserPo {private String name;private Double score;// 省略构造函数及getter、setter
}

以下操作均以UserPo进行讲解

filter

filter:过滤,就是过滤器,符合条件的通过,不符合条件的过滤掉

// 筛选出成绩不为空的学生人数
count = list.stream().filter(p -> null != p.getScore()).count();

map

map:映射,他将原集合映射成为新的集合,在VO、PO处理的过程中较常见。在本例子中,原集合就是PO集合,新集合可以自定义映射为成绩集合,同时也可以对新集合进行相关操作。

// 取出所有学生的成绩
List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());// 将学生姓名集合串成字符串,用逗号分隔
String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

sorted

sorted:排序,可以根据指定的字段进行排序

// 按学生成绩逆序排序 正序则不需要加.reversed()
filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());

forEach

forEach:这个应该是最常用的,也就是为每一个元素进行自定义操作

除了forEach操作会改变原集合的数据,其他的操作均不会改变原集合,这点务必引起注意

// 学生成绩太差了,及格率太低,给每个学生加10分,放个水
// forEach
filterList.stream().forEach(p -> p.setScore(p.getScore() + 10));

collect

collect:聚合,可以用于GroudBy按指定字段分类,也可以用于返回列表或者拼凑字符串

// 按成绩进行归集
Map<Double, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));
for (Map.Entry<Double, List<UserPo>> entry : groupByScoreMap.entrySet()) {System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());
}// 返回list
List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());
// 返回string用逗号分隔
String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));

statistics

statistics:统计,可以统计中位数,平均值,最大最小值

DoubleSummaryStatistics statistics = filterList.stream().mapToDouble(p -> p.getScore()).summaryStatistics();
System.out.println("列表中最大的数 : " + statistics.getMax());
System.out.println("列表中最小的数 : " + statistics.getMin());
System.out.println("所有数之和 : " + statistics.getSum());
System.out.println("平均数 : " + statistics.getAverage());

parallelStream

parallelStream:并行流,可以利用多线程进行流的操作,提升效率。但是其不具备线程传播性,因此使用时需要充分评估是否需要用并行流操作

// 并行流
count = list.parallelStream().filter(p -> null != p.getScore()).count();

3

完整代码

public class UserPo {private String name;private Double score;public UserPo(String name, Double score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}@Overridepublic String toString() {return "UserPo{" +"name='" + name + '\'' +", score=" + score +'}';}
}
public class StreamTest {// +--------------------+ +------+ +------+ +---+ +-------+
// | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
// +--------------------+ +------+ +------+ +---+ +-------+public static void main(String args[]){List<UserPo> list = new ArrayList<>();list.add(new UserPo("小一", 10.d));list.add(new UserPo("小五", 50.d));list.add(new UserPo("小六", 60.d));list.add(new UserPo("小6", 60.d));list.add(new UserPo("小空", null));list.add(new UserPo("小九", 90.d));long count = 0;List<UserPo> filterList = null;// filter 过滤器的使用// 筛选出成绩不为空的学生人数count = list.stream().filter(p -> null != p.getScore()).count();System.out.println("参加考试的学生人数:" + count);// collect// 筛选出成绩不为空的学生集合filterList = list.stream().filter(p -> null != p.getScore()).collect(Collectors.toList());System.out.println("参加考试的学生信息:");filterList.stream().forEach(System.out::println);// map 将集合映射为另外一个集合// 取出所有学生的成绩List<Double> scoreList = list.stream().map(p -> p.getScore()).collect(Collectors.toList());System.out.println("所有学生的成绩集合:" + scoreList);// 将学生姓名集合串成字符串,用逗号分隔String nameString = list.stream().map(p -> p.getName()).collect(Collectors.joining(","));System.out.println("所有学生的姓名字符串:" + nameString);// sorted排序// 按学生成绩逆序排序 正序则不需要加.reversed()filterList = list.stream().filter(p -> null != p.getScore()).sorted(Comparator.comparing(UserPo::getScore).reversed()).collect(Collectors.toList());System.out.println("所有学生的成绩集合,逆序排序:");filterList.stream().forEach(System.out::println);System.out.println("按学生成绩归集:");Map<Double, List<UserPo>> groupByScoreMap = list.stream().filter(p -> null != p.getScore()).collect(Collectors.groupingBy(UserPo::getScore));for (Map.Entry<Double, List<UserPo>> entry : groupByScoreMap.entrySet()) {System.out.println("成绩:" + entry.getKey() + " 人数:" + entry.getValue().size());}// forEachfilterList.stream().forEach(p -> p.setScore(p.getScore() + 10));System.out.println("及格人数太少,给每个人加10分");filterList.stream().forEach(System.out::println);// countcount = filterList.stream().filter(p -> p.getScore() >= 60).count();System.out.println("最后及格人数" + count);DoubleSummaryStatistics statistics = filterList.stream().mapToDouble(p -> p.getScore()).summaryStatistics();System.out.println("列表中最大的数 : " + statistics.getMax());System.out.println("列表中最小的数 : " + statistics.getMin());System.out.println("所有数之和 : " + statistics.getSum());System.out.println("平均数 : " + statistics.getAverage());// 并行流 使用count = list.parallelStream().filter(p -> null != p.getScore()).count();System.out.println("并行流处理参加考试的学生人数:" + count);}}

来源:blog.csdn.net/chaitoudaren/article/details/105122681

【热门内容】

简直无语,又一个知名项目收费了。。已退出!

这是我见过写得最烂的Controller层代码,没有之一!

看看人家SpringBoot的全局异常处理多么优雅...

HTTP 3.0彻底放弃TCP,TCP到底做错了什么?

Redis 官方可视化工具,高颜值,功能真心强大!

领导:谁再用Redis过期监听实现关闭订单,立马滚蛋!

如何搭建一台永久运行的个人服务器?

“核弹级” Log4j 漏洞仍普遍存在,并造成持续影响

无语!Jenkins 也宣布弃用 Java 8。。

300多本程序员经典技术书籍高清PDF
加我微信,备注:资料扫码备注:资料,自动获取

你还在用for循环遍历list吗?相关推荐

  1. JDK8都10岁了,你还在用for循环遍历list吗?

    点击关注公众号,实用技术文章及时了解 简介 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直 ...

  2. pythonfor循环遍历list_为什么for循环可以遍历list:Python中迭代器与生成器

    1 引言 只要你学了Python语言,就不会不知道for循环,也肯定用for循环来遍历一个列表(list),那为什么for循环可以遍历list,而不能遍历int类型对象呢?怎么让一个自定义的对象可遍历 ...

  3. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

  4. Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin

    1.容器API的类图结构如下: JAVA的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象,并可以实现常用数据结构,如栈,队列等,除此之外,JAVA集合还可用于保存具有映射关系的关联数组 ...

  5. 1.12 foreach循环遍历Collection集合

    Java使用foreach循环遍历Collection集合 使用 Iterator 接口迭代访问 Collection 集合里的元素,除了这个方法之外,我们还可以使用 Java 5 提供的 forea ...

  6. JavaScript 中的常用12种循环遍历(数组或对象)的方法

    1.for 循环 1 2 3 4 5 6 7 let arr = [1,2,3]; for (let i=0; i<arr.length; i++){  console.log(i,arr[i] ...

  7. Java:集合for高级循环遍历

    增强for循环: 格式:for(变量数据类型 要遍历的变量 :元素所在数组(集合)名称) 也即 for(Type element: array或collection) 使用foreach遍历集合: 只 ...

  8. Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化

    Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合  (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏 ...

  9. JS 循环遍历 总结

    一.循环遍历语句 for...in... (ES5) 语法:javascript for(keys in obj){} 适用:遍历对象 说明: 1.keys表示obj对象的每一个键值对的键(键名),所 ...

最新文章

  1. dubbo相关的知识点总结
  2. 【SRIO】5、Xilinx RapidIO核例子工程源码分析
  3. Mule学习笔记(二)
  4. mysql explain用法和结果的含义
  5. flink 检查点_Flink检查点和恢复
  6. python dll注入 网络_python – 检测反射型DLL注入
  7. AOP Error creating bean with name ‘myCaculator‘ defined in file [XXX]
  8. 如何去学会黑客技术,黑客电脑技术学习必备知识
  9. 视图层、业务逻辑层、数据访问层及实体层的关系(入门)
  10. linux asm函数,Linux 字符设备驱动—— ioremap() 函数解析
  11. tp3.2 访问地址url大小写及控制器多个单词组成时url
  12. .NET开发不可错过的25款必备工具,徐汇区网站设计
  13. Haproxy配置应用文档
  14. Jieba中文分词 (二) ——词性标注与关键词提取
  15. 保护您的AWS网站免受DDoS攻击
  16. DTD-文档类型定义(Document Type Definition)
  17. 交叉报表制作--Smartbi报表工具一步完成
  18. 腾讯企业邮箱客户端配置
  19. 基于Springboot外卖系统09:员工信息编辑+员工信息保存
  20. 第20节 核心交换机配置热备份详解及实验演示—基于Cisco Packet Tracer

热门文章

  1. UI设计培训教程:UI界面的视觉表现有什么趋势?
  2. word如何自动生成目录-----如何写软件文档
  3. 奇特的“对自杀说不”许可证
  4. [CTF]GUET梦极光杯线上赛个人WP
  5. OpenCV: BGR、HSV、HLS、颜色空间、颜色模型、颜色识别、颜色对应数值查询
  6. PPT如何不改变排布、将多个元素同时等比例调整大小---组合+shift键
  7. 入网许可迟迟不发,iPhone 6入华或拖到10月底
  8. 组学前沿:表观遗传调控的抗肿瘤免疫|综述案例
  9. android settext方法,Android中EditText setText方法的踩坑实战
  10. 华为 android 11,EMUI 11抢先亮相!华为P40 Pro已升:底层非Android 11