1.Stream流是什么
- Stream 是 JDK 8+ 新增的流式编程 API,专门用来简化集合 / 数组的数据处理。
- 分为两大类:
- 中间操作:链式调用,延迟执行,返回新流,可连续调用
- 终端操作:触发整个流执行,执行后流关闭,不能再使用.
二、完整方法分类 + 功能 + 示例
一、获取流(创建流)
| 方法 | 作用 |
|---|---|
集合.stream() |
普通集合获取串行流(最常用) |
集合.parallelStream() |
获取并行流,多线程处理数据 |
Arrays.stream(数组) |
数组转流 |
Stream.of(元素...) |
快速创建流 |
java
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
二、中间操作(链式调用,不立即执行)
1. map 映射(一对一转换,重点)
核心:每个元素转为另一个值 / 类型,元素数量不变常用场景:
- 对象提取字段
- 数值计算、字符串加工
- 类型转换(对象→字符串、字符串→数字等)
java
// 提取字段
list.stream().map(item -> item.getName());
// 数值运算
list.stream().map(n -> n * 2);
// 类型转换
list.stream().map(Integer::parseInt);
2. filter 过滤
核心:按条件剔除元素,保留符合条件的
java
// 保留大于5的数字
stream.filter(n -> n > 5);
3. sorted 排序
sorted():自然升序(默认)sorted(比较器):自定义排序(降序、按对象字段排序)
java
stream.sorted();
stream.sorted((a,b) -> b - a); // 降序
4. distinct 去重
基于 equals() 去除重复元素
java
stream.distinct();
5. limit 截取
截取前 N 个元素
java
stream.limit(3); // 只取前3个
6. skip 跳过
跳过前 N 个元素
java
stream.skip(2); // 跳过前2个
7. flatMap 扁平化(一对多)
把嵌套集合 拆成单层流(一个元素变多个元素),和 map 区分:
map:一对一flatMap:一对多
java
// 把 List<List<Integer>> 拆成普通 Integer 流
stream.flatMap(Collection::stream);
8. 基础类型专用 map(优化装箱)
mapToInt():转IntStreammapToLong():转LongStreammapToDouble():转DoubleStream多用于数值求和、求平均等计算。
三、终端操作(触发执行,结束流)
1. forEach 遍历
逐个消费元素,做输出、执行逻辑
java
stream.forEach(System.out::println);
2. collect 收集(最常用)
把流转回集合 / 字符串 / 分组等结构:
Collectors.toList():收集为 ListCollectors.toSet():收集为 Set(自动去重)Collectors.toMap():收集为 MapCollectors.groupingBy():分组Collectors.joining():字符串拼接
java
// 收集为Set(你代码里的用法)
stream.collect(Collectors.toSet());
3. count 统计数量
返回流中元素总个数,返回值 long
java
long num = stream.count();
4. max / min 最大 / 最小值
获取流中最值,返回 Optional 防止空指针
java
stream.max(Integer::compareTo);
stream.min(Integer::compareTo);
5. 匹配判断(返回 boolean)
anyMatch(条件):任意一个满足条件 → trueallMatch(条件):全部满足条件 → truenoneMatch(条件):全部不满足条件 → true
java
stream.anyMatch(n -> n > 10);
6. reduce 归约聚合
把所有元素反复合并为单个结果,常用于:求和、求乘积、字符串拼接
java
// 求和
stream.reduce(0, Integer::sum);
7. findFirst / findAny 取值
findFirst():获取流第一个元素findAny():获取任意一个元素(并行流常用)
三、核心口诀 & 区分(方便记忆)
- map:提取字段、转换值、换类型(一对一)
- filter:按条件筛数据
- sorted :排序、
distinct:去重 - limit/skip:截取、跳过
- flatMap:拆嵌套集合(一对多)
- collect:流转回集合(收尾必备)
- 其余:遍历、统计、匹配、取最值