李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
二、Stream流操作API
Leefs
2021-05-11 PM
1765℃
0条
# 02.Stream流操作API ### 前言 在学习时,可以把Stream当成一个高级版本的Iterator。 + 原始版的Iterator,用户只能一个一个的遍历元素并对其执行某些操作; + 高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,具体这些操作如何应用到每个元素上,就给Stream就好了! ### 一、通用语法 **1.1 示例** > 获取一个List中,元素不为空的个数。 > ```java //Lists是Guava中的一个工具类 List
nums = Lists.newArrayList(1,null,3,4,null,6); nums.stream().filter(num -> num != null).count(); ``` **1.2 语法剖析** ![02.Stream流操API01.jpg](https://lilinchao.com/usr/uploads/2021/05/4233969703.jpg) **说明** 1. 红色框中的语句是一个Stream的生命开始的地方,负责创建一个Stream实例; 2. 绿色框中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream > 红框的语句生成的是一个包含所有nums变量的Stream,进过绿框的filter方法以后,重新生成了一个过滤掉原nums列表所有null以后的Stream 3. 蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种算法来汇聚成一个值 > 例子中是获取Stream中包含的元素个数。 **1.3 执行过程** 可以通过下图对Stream的执行过程做一个更好的理解 ![02.Stream流操API02.jpg](https://lilinchao.com/usr/uploads/2021/05/2479411284.jpg) **总结** 使用Stream的基本步骤: 1. 创建Stream; 2. 转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象; 3. 对Stream进行聚合(Reduce)操作,获取想要的结果。 ### 二、创建Stream方式 **2.1 生成流的方式** > default Stream
stream():返回一个顺序流 > > default Stream
parallelStream():返回一个并行流 **区别** + `stream`是顺序流,由主线程按顺序对流执行操作 + `parallelStream`是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。 例如筛选集合中的奇数,两者的处理不同之处: ![02.Stream流操API03.png](https://lilinchao.com/usr/uploads/2021/05/830030620.png) 如果流中的数据量足够大,并行流可以加快处理速度。 **PS** 除了直接创建并行流,还可以通过`parallel()`把顺序流转成并行流: ```java Optional
findFirst = list.stream().parallel().filter(x->x>4).findFirst(); ``` **2.2 五种方式创建Stream** 1. 通过`java.util.Collection.stream()`方法用集合创建流 ```java List
list = Arrays.asList("hello","world","stream"); //创建顺序流 Stream
stream = list.stream(); //创建并行流 Stream
parallelStream = list.parallelStream(); ``` 2. 使用`java.util.Arrays.stream(T[] array)`方法用数组创建流 ```java String[] array = {"h", "e", "l", "l", "o"}; Stream
arrayStream = Arrays.stream(array); ``` 3. 使用`Stream.generate`静态方法创建Stream流 ```java Stream stream3 = Stream.generate(() -> 1); stream3.limit(3).forEach(System.out::println); ``` 通过**generate**方法创建的Stream流,长度是无限长的,如果没有limit()方法,程序会一直打印下去 4. 使用`Stream.iterate`静态方法创建Stream流 ```java Stream stream4 = Stream.iterate(1,i -> i+1); stream4.limit(4).forEach(System.out::println); ``` 通过**iterate**方法创建的Stream流,长度是无限长的,iterate有两个参数,第一个参数是初始元素的值,第二个元素是一个UnaryOperator对象,定义每次元素的变化规则 5. 使用`Stream.of`静态方法创建Stream流 ```java Stream
stringStream = Stream.of("hello", "hi", "hei"); stringStream.forEach(System.out::println); ``` ### 三、Stream流API #### **3.1 Stream的中间操作** 多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理!而在终止操作时一次性全部处理,称为“惰性求值” **筛选与切片** | 方法 | 描述 | | ------------------- | ------------------------------------------------------------ | | filter(Predicate p) | 接收Lambda,从流中排除某些元素。 | | distinct() | 筛选,通过流所生成元素的hashCode()和equals()去除重复元素 | | limit(long maxSize) | 截断流,使其元素不超过给定数量 | | skip(long n) | 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补 | **映射** | 方法 | 描述 | | ------------------------------- | ------------------------------------------------------------ | | map(Function f) | 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。 | | mapToDouble(ToDoubleFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream。 | | mapToInt(ToIntFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream。 | | mapToLong(ToLongFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongFunction。 | | flatMap(Function f) | 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流 | **排序** | 方法 | 描述 | | ----------------------- | ---------------------------------- | | sorted() | 产生一个新流,其中按自然顺序排序 | | sorted(Comparator comp) | 产生一个新流,其中按比较器顺序排序 | #### 3.2 Stream的终止操作 终止操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如List、Integer 甚至是void。 **查找与匹配** | 方法 | 描述 | | ---------------------- | ------------------------ | | allMatch(Predicate p) | 检查是否匹配所有元素 | | anyMatch(Predicate p) | 检查是否至少匹配一个元素 | | noneMatch(Predicate p) | 检查是否没有匹配所有元素 | | findFirst() | 返回第一个元素 | | findAny() | 返回当前流宏的任意元素 | | count() | 返回流中元素总数 | | max(Comparator c) | 返回流中最大值 | | min(Comparator c) | 返回流中最小值 | | forEach(Consumer c) | 内部迭代 | **归约** | 方法 | 描述 | | :------------------------------ | ---------------------------------------------------------- | | reduce(T iden,BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 T | | reduce(BinaryOperator b) | 可以将流中元素反复结合起来,得到一个值。返回 `Optional
` | **收集** | 方法 | 描述 | | -------------------- | ------------------------------------------------------------ | | collect(Collector c) | 将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法 | Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。 但是Collector实用类提供了很多静态方法可以方便的收集常见实例 ![02.Stream流操API04.png](https://lilinchao.com/usr/uploads/2021/05/3856942558.png) ![02.Stream流操API05.png](https://lilinchao.com/usr/uploads/2021/05/4291384637.png) *附:* [参考文章链接1](http://ifeve.com/stream/) [参考文章链接2](https://www.cnblogs.com/CF1314/p/14047138.html) [参考文章链接3](https://www.cnblogs.com/drl-blogs/p/10803415.html)
标签:
Stream流
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1249.html
上一篇
一、Stream流概念介绍
下一篇
三、Stream流分组操作
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Java编程思想
前端
国产数据库改造
稀疏数组
DataWarehouse
Spark
数据结构
Scala
高并发
Java工具类
栈
二叉树
Filter
pytorch
GET和POST
随笔
LeetCode刷题
机器学习
MyBatisX
哈希表
Beego
Redis
Elastisearch
数据结构和算法
Zookeeper
Nacos
JavaWEB项目搭建
线程池
Hbase
Golang基础
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭