【Java8新特性】Stream流
文章目录
什么是Stream流
创建Stream流
使用Stream流(常用API)
fliter():按条件进行过滤
limit():按个数进行取出
distinct():去重
skip():跳过前N个流,开始截取
map():对集合元素逐个进行函数操作,映射成全新的一个集合
flatmap():接收一个函数作为参数,将流中的值进行函数操作后,然后把所有流连接成一个流
sorted():排序,可自定义排序
Collectors.groupingBy:按条件进行分组
查找匹配
reduce():将流中的数据反复结合起来得到一个值
终止操作
查找与匹配
归约
Collector 接口中方法
什么是Stream流
在《java8 in action》书中,作者说目前我们在几乎所有开发中都会用到集合,但是目前集合在程序开发中的表现还不够完美
,比如你利用集合处理大量数据时,你不得不面对性能问题,不得不考虑进行并行代码的编写,这些工作都是比较繁重的,于是作者便创造了Stream 流。相比较Collection集合来说,Stream在开发中就具有许多独特的优点。
- 以声明式的方式处理数据集合——更简洁,更易读
- 可复合——更灵活
- 可并行——无需写任何多线程代码,Stream API自动处理这些问题,性能更好
注意:map是无法使用stream流,可以将key-value单独取出来做流处理
创建Stream流
有三种方式创建流,静态方法,集合流(常用),数组流。
//静态方法Stream.of("start",1,2,3,"end");//集合流ArrayList<Object> arrayList = new ArrayList<>();arrayList.stream();//数组流int[] ints = new int[5];Arrays.stream(ints);
使用Stream流(常用API)
首先创建一个Student类测试
public class Student {private String name;public Student(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}
}
List<Employee> employeeList = Arrays.asList(new Employee(101,"杰斯",29,10000.02),new Employee(101,"杰斯",29,20000.02),new Employee(102,"莫甘娜",19,500.02),new Employee(103,"剑姬",31,4399.02),new Employee(104,"刀妹",25,7777.02),new Employee(105,"提莫",44,100.02));
fliter():按条件进行过滤
employeeList
.stream()
.filter(x->x.getAge()>20)
.forEach(System.out::println);
取出年龄大于20岁的结果
------------按条件过滤-------------
Employee{id=101, name='杰斯', age=29, salary=10000.02}
Employee{id=101, name='杰斯', age=29, salary=20000.02}
Employee{id=103, name='剑姬', age=31, salary=4399.02}
Employee{id=104, name='刀妹', age=25, salary=7777.02}
Employee{id=105, name='提莫', age=44, salary=100.02}
limit():按个数进行取出
employeeList
.stream()
.limit(2)
.forEach(System.out::println);
取出前两个结果
-------------选择前几个输出------------
Employee{id=101, name='杰斯', age=29, salary=10000.02}
Employee{id=101, name='杰斯', age=29, salary=20000.02}
distinct():去重
employeeList
.stream()
.distinct()
.forEach(System.out::println);
skip():跳过前N个流,开始截取
employeeList
.stream()
.skip(4)
.forEach(System.out::println);
跳过前4个流
--------------跳过前4个流,取后面的流-----------
Employee{id=104, name='刀妹', age=25, salary=7777.02}
Employee{id=105, name='提莫', age=44, salary=100.02}
map():对集合元素逐个进行函数操作,映射成全新的一个集合
employeeList
.stream()
.map(x->x.getSalary()+10000) //将工资都加10000
.forEach(System.out::println);
------------map(接受lambda,将一个函数作为参数,应用到每个元素上,输出新的流)---------
20000.02
30000.02
10500.02
14399.02
17777.02
10100.02
flatmap():接收一个函数作为参数,将流中的值进行函数操作后,然后把所有流连接成一个流
System.out.println("--------------flatmap(连接)-----------");List<String> list = Arrays.asList("hello", "word");System.out.println(list); //[hello, word]List<Object> collect1 = list.stream().map(x -> x.split("")).flatMap(Arrays::stream).collect(Collectors.toList());System.out.println(collect1); //[h, e, l, l, o, w, o, r, d]
如果不加flatmap,会输出[ [h,e,l,l,o] [w,o,r,d] ] 两个流,flatmap就是将这两个数组流合并成了一个流
sorted():排序,可自定义排序
employeeList.stream().sorted((x,y) ->{if (x.getAge().equals(y.getAge())) {return x.getSalary().compareTo(y.getSalary());}else {return x.getAge().compareTo(y.getAge());}}).forEach(System.out::println);
--------------排序(自定义排序)-----------
Employee{id=102, name='莫甘娜', age=19, salary=500.02}
Employee{id=104, name='刀妹', age=25, salary=7777.02}
Employee{id=101, name='杰斯', age=29, salary=10000.02}
Employee{id=101, name='杰斯', age=29, salary=20000.02}
Employee{id=103, name='剑姬', age=31, salary=4399.02}
Employee{id=105, name='提莫', age=44, salary=100.02}先按年龄排队,再按工资排队
Collectors.groupingBy:按条件进行分组
Map<Boolean, List<Employee>> collect1 = employeeList
.stream()
.collect(Collectors.groupingBy(x -> x.getAge() > 20));
{false=[Employee{id=102, name='莫甘娜', age=19, salary=500.02}],
true=[Employee{id=101, name='杰斯', age=29, salary=10000.02},
Employee{id=101, name='杰斯', age=29, salary=20000.02},
Employee{id=103, name='剑姬', age=31, salary=4399.02},
Employee{id=104, name='刀妹', age=25, salary=7777.02},
Employee{id=105, name='提莫', age=44, salary=100.02}]}
查找匹配
employeeList.stream().anyMatch(x->x.getAge()==29);employeeList.stream().allMatch(x->x.getAge()==29);employeeList.stream().noneMatch(x->x.getAge()==29);employeeList.stream().findFirst();employeeList.stream().findAny();employeeList.stream().count();employeeList.stream().max((x, y) -> x.getAge().compareTo(y.getAge()));employeeList.stream().min(Comparator.comparing(Employee::getAge));
reduce():将流中的数据反复结合起来得到一个值
//设置初始值List<Integer> list = Arrays.asList(1, 2, 3);System.out.println(list.stream().reduce(100, (x, y) -> x * y));//不设置初始值List<Integer> list = Arrays.asList(2, 2, 3);System.out.println(list.stream().reduce( (x, y) -> x * y));
600
12
终止操作
会中止流操作,返回结果的函数
查找与匹配
allMatch(Predicate p) | 检查是否匹配所有元素 |
anyMatch(Predicate ) | 检查是否至少匹配一个元素 |
noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
findFirst() | 返回第一个元素 |
findAny() | 返回当前流中的任意元素 |
count() | 返回流中元素总数 |
max(Comparator c) | 返回流中最大值 |
min(Comparator c) | 返回流中最小值 |
forEach(Consumer c) | stream API 使用内部迭代 |
归约
reduce () | 将流中元素反复结合起来,得到一个值。 |
Collector 接口中方法
Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)。但是 Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例.
【Java8新特性】Stream流相关推荐
- Java8新特性Stream流详解
陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...
- java8新特性stream流
参考自深蓝至尊的Java8 新特性之流式数据处理 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式 ...
- Java8新特性——Stream流:不同于IO流的流,操作集合数据
文章目录 Stream流 1.认识Stream流(源码说明) 1.1.Stream流和Collection的区别 1.2.流的获取方式 1.3.流操作和管道 1.4.并行性 1.5.不干扰内政 1.6 ...
- 【Stream】java8新特性Stream流总结
一.什么是stream 在 java8 中增加了一个新的抽象接口 Stream API,使用 Stream 操作集合类似于使用 SQL 语句数据库查找数据类似,提供直观的方法进行操作. Stream ...
- java8新特性 Stream流的优雅操作
1. 使用传统的方式,遍历集合,对集合中的数据进行过滤 //创建一个List集合,存储姓名List<String> list = new ArrayList<>();list. ...
- Java8新特性stream流的优雅操作
文章目录 原因是因为我管理的小组提交代码被我review到了,发现只有个别同学使用到了stream流,所以出此blog,希望大家都写出优雅的代码 原因是因为我管理的小组提交代码被我review到了,发 ...
- 利用Java8新特性stream流给集合中的某个属性赋值
今天在编写一个返回对象VO时,需要做一些处理,返回对象VO如下: CollectListVO @Data @JsonIgnoreProperties(ignoreUnknown = true) @Ap ...
- Java8新特性 Stream流常用方法
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- Java8新特性 stream流常用方法
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- java8新特性-Stream流
直接贴代码: package com.c8a.stream;import lombok.AllArgsConstructor; import lombok.Data; import lombok.No ...
最新文章
- kwargs.pop是什么意思
- Scrum看板工具Leangoo敏捷企业实践分享
- 中国计算机专业专科学校排名2015,计算机专科学校排名前十(最出名的10所计算机学院)...
- WebDAV服务漏洞利用工具DAVTest
- 欧洲安全研究人员:黑客是如何泄露加密电子邮件
- 工业互联网企业如何做,才能“赋能万物,连接未来”?
- FreeMarker标签与使用
- vscode生成vue模板快捷键_vs code 快速生成vue 模板
- 解决:(1062, Duplicate entry '2019-08-30' for key 'rdate')
- [Java] 蓝桥杯ADV-213 算法提高 3-2求存款
- HTK搭建大词汇量连续语音识别系统(三)
- 我查查 6.6 去校验分析
- html5 苹果 风格,[网页设计]8个超炫酷仿苹果应用的HTML5动画
- 区块链跨链技术之BTC Relay
- php获取指定日期的节假日信息
- 综合Synthesis
- 【GD32F310开发板试用】编码器接口的使用
- c语言字符图形的操作叙述,C语言课程设计--(图形编程_全).doc
- 【总结】4S汽车维修管理系统ssm框架vuejs项目
- ibox (bootstrap)
热门文章
- 杂谈---一个项目经理的自我反省
- web服务器基于那个协议,网页浏览服务基于什么协议 Web服务器是基于什么协议...
- Widows Server 2012上无法安装.net framework 3.5
- filtering_audio.c/filtering_video.c 解读
- DS树--找出直系亲属
- python电影爬虫背景介绍_Python爬虫入门教程01之爬取豆瓣Top电影
- 求一个n阶矩阵的转置矩阵
- 如何用windows7搭建radius服务器
- 项目日历是什么?如何规划?
- ARPG、MMORPG、MOBA、卡牌类、棋盘类游戏服务器架构图