目录
1、Stream流概述
1.1、什么是Stream流:
在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
目的:用于简化集合和数组操作的API。
1.2、Stream流思想:
Stream流式思想的核心:
1.先得到集合或者数组的Stream流(就是一根传送带)
2.把元素放上去
3.然后就用这个Stream流简化的API来方便的操作元素。
1.3、案例:体验Stream流的作用:
package com.itwpf.day02_Stream;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
Stream<String> listStream = list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张") && s.length() == 3;
}
});
List<String> collect = listStream.collect(Collectors.toList());
System.out.println(collect);
}
}
//输出:[张无忌, 张三丰]
2、Stream流的获取
Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
2.1、集合获取Stream流的方式
可以使用Collection接口中的默认方法stream()生成流
名称 | 说明 |
default Stream<E> stream() | 获取当前集合对象的Stream流 |
//Collection集合获取流
Collection<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
2.2、数组获取Stream流的方式
名称 | 说明 |
public static <T> Stream<T> stream(T[] array) | 获取当前数组的Stream流 |
public static<T> Stream<T> of(T... values) | 获取当前数组/可变数据的Stream流 |
//数组获取流
String[] names = {"张三", "李四", "王五"};
Stream<String> streamnames1 = Arrays.stream(names);
Stream<String> streamnames2 = Stream.of(names);
2.3、Map集合获取Stream流的方式
//Map集合获取流
Map<String, Integer> map = new HashMap<>();
//键流
Stream<String> keyStream = map.keySet().stream();
//值流
Stream<Integer> valueStream = map.values().stream();
//键值对流
Stream<Map.Entry<String, Integer>> keyAndValueStream = map.entrySet().stream();
2.3、Stream流的三类方法
获取Stream流
创建一条流水线,并把数据放到流水线上准备进行操作
中间方法
流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
终结方法
一个Stream流只能有一个终结方法,是流水线上的最后一个操作
3、Stream流的常用方法
3.1、Stream流的常用API(中间操作方法)
名称 | 说明 |
Stream<T> filter(Predicate<? super T> predicate) | 用于对流中的数据进行过滤。 |
Stream<T> limit(long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
Stream<T> distinct() | 去除流中重复的元素。依赖(hashCode和equals方法) |
static <T> Stream<T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
注意:
中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
在Stream流中无法直接修改集合、数组中的数据。
3.2、Stream流常见终结操作方法
名称 | 说明 |
void forEach(Consumer action) | 对此流的每个元素执行遍历操作 |
long count() | 返回此流中的元素数 |
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了
4、Stream流的综合应用
案例:
需求:某个公司的开发部门,分为开发一部和二部,现在需要进行年中数据结算。
分析:
①:员工信息至少包含了(名称、性别、工资、奖金、处罚记录)
②:开发一部有4个员工、开发二部有5名员工
③:分别筛选出2个部门的最高工资的员工信息,封装成优秀员工对象Topperformer
④:分别统计出2个部门的平均月收入,要求去掉最高和最低工资。
⑤:统计2个开发部门整体的平均工资,去掉最低和最高工资的平均值。
可以看看这一篇,解决了这个案例
Stream流案例_程序员胡默默的博客-优快云博客_stream流案例
5、收集Stream流
Stream流的收集操作:
含义:就是把Stream流操作后的结果转回到集合或者数组中去。
Stream流:方便操作集合/数组的手段
集合/数组:才是开发中的目的。
Stream流的收集方法:
名称 | 说明 |
R collect(Collector collector) | 开始收集Stream流,指定收集器 |
Collectors工具类提供了具体的收集方式
名称 | 说明 |
public static <T> Collector toList() | 把元素收集到List集合中 |
public static <T> Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |