Java8 Stream
程序员文章站
2022-04-03 23:43:05
概述 Java8 API中添加了一个新的抽象成为流Stream,可以以一种声明的方式处理数据。 Stream与java.io包中的InputStream和OutputStream是完全不同的概念。Java8中的Stream是对集合对象功能的增强,专注与对集合对象进行各种非常便利、高效的聚合操作,或大 ......
概述
java8 api中添加了一个新的抽象成为流stream,可以以一种声明的方式处理数据。
stream与java.io包中的inputstream和outputstream是完全不同的概念。java8中的stream是对集合对象功能的增强,专注与对集合对象进行各种非常便利、高效的聚合操作,或大批量数据操作。
stream就像一个高级版本的迭代器,用户只要给出需要对其包含的元素是执行什么操作,stream会在内部隐式进行遍历,做出相应的数据转换。
stream和迭代器又有不同,stream可以并行操作,即将数据分为多段,其中每一个都在不同的线程中处理,然后将结果一起输出。
先看下面一个例子:
通过这个例子,可以看出引入流的操作后代码的简洁。
使用
使用stream的步骤如下:
- 创建stream
- 通过一个或多个中间操作将流转换成另一个流
- 通过中止操作获取结果.
1.创建stream
集合类collection:
- stream(): 创建串行流
- parallelstream(): 创建并行流
数组:
arrays.stream(arr): 通过静态方法获取数组的串行流
arrays.stream(arr, int, int): 返回数组的串行流,指定数组范围
数字类:
intstream: 整型的流接口, 有如下静态方法:
- empty(): 获取一个空的串行流
- generate(intsupplier): 返回指定接口产生的数字无限流
- of(int,int...): 返回指定数字的串行流
- of(int): 返回包含指定数字的串行流
- range(start, end): 返回从start到end的整数流, 前闭后开
- rangeclosed(start, end): 返回从start到end的整数流, 前闭后闭
doublestream: 小数的流接口, 有如下静态方法:
- of(double,double...): 返回指定数字的串行流
- of(double): 返回包含指定数字的串行流
- generate(intsupplier): 返回指定接口产生的数字无限流
longstream: 长整形的流接口, 有如下静态方法:
- generate(intsupplier): 返回指定接口产生的数字无限流
- of(long,long...): 返回指定数字的串行流
- of(long): 返回包含指定数字的串行流
- range(start, end): 返回从start到end的整数流, 前闭后开
- rangeclosed(start, end): 返回从start到end的整数流, 前闭后闭
random: 随机数, 有如下方法生成流(不是静态方法)
- doubles(): 返回无限的随机数流, 值在0-1之间
- double(long): 返回给定数量的随机数流, 值在0-1之间
- doubles(start, end): 返回无限的随机数流, 值在start-end之间
- doubles(long, start, end): 返回给定数量的随机数流, 值在start-end之间
- ints(), longs() 与doubles函数相同
等等操作, 请自行尝试
2.流操作
stream: 流的接口, 其中定义了如下对流中间操作的方法:
- distinct(): 对流中元素去重, 通过equals函数
- filter(function): 对流中元素进行过滤, 去除经过方法返回false的元素
- limit(long): 截取流的前long个元素
- skip(long): 丢弃流中的前long个元素
- map(function): 将流中的每个元素经过方法进行计算
- maptodouble(function): 将流中每个元素经过方法转换成double
- maptoint(function): 将流中每个元素经过方法转换成int
- maptolong(function): 将流中每个元素经过方法转换成long
- sorted(): 对流中元素根据自然顺序进行排序
- sorted(function): 根据方法的比较结果对流中元素进行排序
当然还有其它操作
3.获取结果操作
stream: 流的接口, 其中定义了如下对流结果操作的方法:
- foreach(function): 对流中元素进行遍历
- allmatch(function): 判断流中是否所有元素经过函数均为true
- anymatch(function): 判断流中是否存在经过函数返回true的原上诉
- nonematch(function): 判断流中是否所以有元素经过函数均为false
- count(): 统计流中元素的个数
- max(function): 经过指定函数进行比较,返回最大值
- min(function): 经过指定函数进行比较,返回最小值
- toarray(): 将流转换成数组
当然还有其他操作,更多操作, 请自行尝试
上一篇: 泛型学习笔记
推荐阅读
-
乐字节-Java8新特性之Base64和重复注解与类型注解
-
java8中使用java.util.Base64报“java.lang.IllegalArgumentException: Illegal base64 character d”
-
Java8中不再需要StringBuilder拼接字符串的详情介绍
-
java8如何用Stream查List对象某属性是否有重复
-
Java 8 Stream操作类型及peek示例解析
-
利用AdoDb.Stream对象来读取UTF-8格式的文本文件
-
java8中java.time.LocalDateTime的json格式化
-
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
-
Redis入门 - 数据类型:Stream详解
-
java8 lamda 例子记录