什么是流

在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。

流是用于简化集合和数组操作的API,可以类比为将数据转化为流水线上的产品,通过各种中间和终结方法对数据进行操作。

  • 目的:用于简化集合和数组操作的API

Stream流式思想的核心

  1. 先得到集合或者数组的Stream流(就是一根传送带)
  2. 把元素放上去
  3. 然后就用这个Stream流简化的API来方便的操作元素。

Stream流的作用

结合了Lambda表达式,简化集数组的操作

Stream流的使用步骤

  1. 先得到一条Stream流,并把数据放上去

image-20221211150801332

  1. 利用流中的各种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流中的中间方法

image-20221211155044388

  • 中间方法会返回新的Stream流,建议使用链式编程
  • 流只能使用一次
  • 改变流中的数据并不会修改原数组或集合中的数据

Stream中的终结方法

image-20221211161130051

  • 收集流中的数据放到数组中
//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 ->某种操作));