李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
二、Stream流操作API
Leefs
2021-05-11 PM
1174℃
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://www.lilinchao.com/archives/1249.html
上一篇
一、Stream流概念介绍
下一篇
三、Stream流分组操作
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
SpringBoot
Python
Java编程思想
MyBatisX
机器学习
Spark Streaming
线程池
FastDFS
设计模式
Hive
Stream流
Hbase
Redis
Eclipse
Sentinel
nginx
Scala
查找
Elastisearch
递归
Filter
SpringCloud
MyBatis-Plus
LeetCode刷题
Netty
ClickHouse
Spark
Spark RDD
Kibana
Flink
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞