java8-Stream流式编程
Stream流式编程
Stream流式编程
解决的问题
之前在处理集合的 问题上,代码冗长,不够简洁。
核心思想
Stream流式思想类似于工厂车间的生产流水线,Stream不是数据结构,也不保存数据,而是对数据进行加工处理。
Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。
使用Stream API 可以快速完成筛选,切片,映射,查找,去重,统计,匹配和规约。
Stream流的获取方式
1.根据Collection获取
Collection 接口中加入了default方法stream,实现了Collection接口的集合都可以通过对象实例.stream()获取Stream流。
Map接口没有实现Collection接口,只能获取Map的Key集合、Value集合或者是entrySet然后做相应的操作。
2.通过Stream的of方法
由于数组对象不能添加默认方法,所以Stream提供了of方法,来对数组进行Stream流式操作。
Stream.of(T[])
注意:基本数据类型不行,例如Integer[]可以,int[]不可以。
常用方法
方法名 | 方法作用 | 返回值类型 | 方法种类 |
---|---|---|---|
count | 统计个数 | long | 终结 |
forEach | 逐一处理 | void | 终结 |
filter | 过滤 | Stream | 函数拼接 |
limit | 取用前几个 | Stream | 函数拼接 |
skip | 跳过前几个 | Stream | 函数拼接 |
map | 映射 | Stream | 函数拼接 |
concat | 组合 | Stream | 函数拼接 |
终结:不能再使用Stream方法。
注意:
- 不调用终结方法,中间的函数拼接不会执行。
- Stream只能操作一次。
forEach
用来遍历流中的数据
void forEach(Consumer<? super T> action);
该方法接受一个Comsumer接口,将流中的每一个元素交给函数处理。
count
统计流中元素的个数。
filter
filter用来过滤数据,返回符合条件的数据。
通过filter方法将一个流转换为另一个子集流。
Stream<T> filter(Predicate<? super T> predicate);
接收一个Predicate接口作为筛选条件。
limit
limit可以对流进行截取处理,只取前n个
Stream<T> limit(long maxSize);
skip
跳过前面几个元素
map
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
接收一个Function接口,将数据转换为另外一种数据。
sorted
可以自然排序,也可以实现Compareable接口来排序。
distinct
去掉重复数据,通过hashCode和equils判断是否重复。
reduce
将所有数据归纳得到一个数据。
T reduce(T identity, BinaryOperator<T> accumulator);
identity 初始值,accumulator累计算法。
第一次将identity 赋值给x,流中的第一个数据赋值给y。之后x = x + y, y = 流中的下一个值。
最后返回累计计算的值。
通过reduce可以算出流中的最大值,最小值和累加减乘除值。
map和reduce的组合
利用map和reduce可以完成大部分的统计任务。
concat
如果有两个流,希望合并成为一个流。可以使用Stream中的静态方法concat
collect
将流中的数据转换成新的集合,一般可以使用Collections.toList()
结果收集
结果收集到集合中
- collect(Collections.toList())将结果生成一个List
- collect(Collections.toSet())将结果生成一个Set
- collect(Collections.toCollection(ArrayList::new)) 指定生成的集合类型
结果收集到数组中
- toArray() 生成一个Object数组
- toArray(String[]::new) 指定生成类型
聚合计算
使用Stream处理数据后,可以像数据库的聚合函数一样,进行聚合计算。
在collect()中使用
- Collectors.minBy()
- Collectors.maxBy()
- Collectors.summingInt()
- Collectors.averagingInt()
- Collectors.counting()
分组操作
根据某种属性,分组。
- 普通分组: 在collect()中使用Collectors.groupingBy(),返回一个Map<key,value>。 提供一个Function,返回Key的值。根据Key进行分组
- 多级分组: 在groupingBy()的第二个参数还可以再放置一个groupingBy()实现多级分组。
分区操作
通过Collectors.partitioningBy()返回一个map,map的key为true 和 false ,两个集合,一个集合是true数组,另外一个集合是false数组。
将流中数据拼接为字符串
Collectors.joining()返回一个字符串 还可以指定分隔符,前缀,后缀