什么是流
在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
流是用于简化集合和数组操作的API,可以类比为将数据转化为流水线上的产品,通过各种中间和终结方法对数据进行操作。
- 目的:用于简化集合和数组操作的API
Stream流式思想的核心
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后就用这个Stream流简化的API来方便的操作元素。
Stream流的作用
结合了Lambda表达式,简化集数组的操作
Stream流的使用步骤
- 先得到一条Stream流,并把数据放上去
- 利用流中的各种API进行各种操作(过滤,转换,统计…)
流中的各种方法分为以下两类
- 中间方法:方法调用完毕之后还可以调用其他的方法
fliter等
- 终结方法:方法调用完毕之后不能再调用其他的方法
输出打印等
单列集合获取Stream流并打印
List<String> list = new ArrayList<>();
list.stream().foreach(s -> System.out.println(s));
双列集合获取Stream流并打印
HashMap<String,Integer> map = new HashMap<>();
//获取并打印所有的键
map.keySet().stream.foreach(s -> System.out.println(s));
//获取并打印所有的键值对
map.entrySet().stream.foreach(s -> System.out.println(s));
数组获取Stream流并打印
int [] a = new int[];
Arrays.stream(a).foreach(s -> System.out.println(s));
- 数组不应使用
Stream.of()
方法获取流,当数组中为引用数据类型时,流上的数据是地址 - 该方法会将整个数组当作一个元素放到流中
零散数据获取Stream流
欲转换的零散数据们必须是同种数据类型的
Stream.of(数据).foreach(s -> System.out.println(s));
Sream流中的中间方法
- 中间方法会返回新的Stream流,建议使用链式编程
- 流只能使用一次
- 改变流中的数据并不会修改原数组或集合中的数据
Stream中的终结方法
- 收集流中的数据放到数组中
//IntFunction的泛型:具体类型的数组
//apply的形参:流中数据的个数,要与数组的长度保持一致
//apply的返回值,具体类型的数组
//方法体:创建数组
list.stream().toArray(new IntFunction<String[]>{
@Override
public Object[] apply(int value){
return new Object[value];
}
});
//Lsambda表达式
String[] arr = list.stream().toArray(value -> new String[value]);
- 收集流中的数据到集合中
List<String> list = oldList.stream().filter(某种操作).collect(Collectors.tolist());
Set<String> set = oldList.stream().filter(某种操作).collect(Collectors.tolist());
- 若需要将流收集到Map中,需要使用
toMap
方法
该方法有两个参数,参数一表示键的生成规则,参数二表示值的生成规则,使用时需要注意作为键的值不能重复
参数一:
Function泛型一:表示流中的数据类型
泛型二:表示Map集合中键的数据类型
Apply方法形参:依次表示流中,每一个数据
方法体:生成键的代码
返回值:生成的键
参数二:
Function泛型一:表示流中的数据类型
泛型二:表示Map集合中值的数据类型
Apply方法形参:依次表示流中,每一个数据
方法体:生成值的代码
返回值:生成的值
Map<T,T> map = list.stream().filter(某种操作)
.collect(Collection.toMap(
s -> 某种操作),
s ->某种操作));