一、Stream 流核心知识点
1. 核心定位与使用步骤
- 核心作用:结合 Lambda 表达式简化集合 / 数组的数据处理,让代码更简洁易读。
- 使用流程 :
- 获取流:将集合 / 数组 / 零散数据放入 Stream 流(流水线);
- 中间操作:对流中数据进行过滤、转换等处理(返回新流,可链式调用);
- 终结操作:统计、打印、收集数据(调用后流关闭,不可复用)。
2. 获取 Stream 流的方式
表格
| 数据源类型 | 获取方法 | 示例 |
|---|---|---|
| 单列集合 | Collection.stream() |
list.stream() |
| 双列集合 | 先转单列集合再获取 | map.entrySet().stream() |
| 数组 | Arrays.stream(数组) |
Arrays.stream(arr) |
| 零散数据 | Stream.of(数据...) |
Stream.of(1,2,3) |
3. 常用 API 分类
(1)中间方法(返回新流,可链式调用)
表格
| 方法名 | 功能 | 注意事项 |
|---|---|---|
filter(Predicate) |
过滤符合条件的元素 | - |
limit(long n) |
获取前 n 个元素 | - |
skip(long n) |
跳过前 n 个元素 | - |
distinct() |
元素去重 | 依赖 hashCode() + equals() |
concat(Stream a, Stream b) |
合并两个流 | 静态方法 |
map(Function) |
转换元素数据类型 | - |
关键特性:修改流中数据不会影响原集合 / 数组;原流只能使用一次,建议链式编程。
(2)终结方法(调用后流关闭)
表格
| 方法名 | 功能 |
|---|---|
forEach(Consumer) |
遍历流中元素 |
count() |
统计元素个数 |
toArray() |
收集数据到数组 |
collect(Collector) |
收集数据到集合(List/Set/Map) |
二、方法引用核心知识点
1. 基础规则
- 核心概念:复用已有方法作为函数式接口抽象方法的方法体,是 Lambda 表达式的简化写法。
- 核心符号 :
::(方法引用符),分隔 "类 / 对象" 与 "方法名"。 - 使用前提 :
- 引用处必须是函数式接口(仅一个抽象方法);
- 被引用方法已存在,且形参 / 返回值与抽象方法一致;
- 被引用方法功能匹配业务需求。
2. 方法引用分类与格式
表格
| 引用类型 | 格式 | 示例 | 关键说明 |
|---|---|---|---|
| 静态方法 | 类名::静态方法名 |
Integer::parseInt |
直接引用类的静态方法 |
| 成员方法(其他类) | 对象::方法名 |
new StringUtil()::toUpperCase |
需创建对应类的对象 |
| 成员方法(本类) | this::方法名 |
this::print |
本类中直接引用当前对象的方法 |
| 成员方法(父类) | super::方法名 |
super::sayHello |
子类中引用父类的成员方法 |
| 构造方法 | 类名::new |
Student::new |
复用构造方法创建对象 |
| 类名引用成员方法 | 类名::成员方法名 |
String::substring |
抽象方法第一个参数为该类类型时可用 |
| 数组构造方法 | 数据类型[]::new |
int[]::new |
用于创建指定类型的数组 |
3. 抽象方法形参关键规则
- 第一个参数:代表被引用方法的调用者(Stream 流中通常是流中每个数据),决定可引用的类;
- 后续参数:需与被引用方法的形参完全一致;无后续参数则被引用方法为无参方法。
