JDK8 Stream流操作全解析
·
一、Stream 流简介
JDK8 新特性,用于简化集合 / 数组的数据处理,通过链式调用完成筛选、转换、统计等操作,代码简洁易读。 整体流程:获取流 → 中间操作(可链式) → 终结操作(关闭流)
二、4 种获取 Stream 流对象的方式
1.单列集合(List/Set)
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
2..数组
int[] arr = {1,2,3};
IntStream stream = Arrays.stream(arr);
3.多零散数据
Stream<String> stream = Stream.of("a","b","c");
4.双列集合 Map
- 获取键流:
map.keySet().stream() - 获取值流:
map.values().stream() - 获取键值对流:
map.entrySet().stream()
三、Stream 中间操作(返回新流,可链式调用)
| 方法 | 作用 |
|---|---|
| filter(Predicate) | 过滤,保留满足条件元素 |
| limit(long n) | 截取前 n 个元素 |
| skip(long n) | 跳过前 n 个元素 |
| distinct() | 去重(依赖 hashCode+equals) |
| map(Function) | 类型转换 / 元素加工 |
| concat(a,b) | 静态方法,合并两个流 |
//筛选以"张"开头、长度为3的字符串
list.stream()
.filter(s -> s.startsWith("张"))
.filter(s -> s.length() == 3)
.forEach(System.out::println);
四、Stream 终结操作(关闭流,无法继续链式)
执行后流失效,必须作为链式最后一步
forEach(Consumer):遍历所有元素count():返回流中元素总个数(long 类型)
五、收集操作 collect ()
将流处理后的结果转回集合,核心工具类Collectors
- 转 List:
Collectors.toList() - 转 Set:
Collectors.toSet() - 转 Map:
Collectors.toMap(键映射,值映射)
//过滤偶数,收集为新List
List<Integer> newList = list.stream()
.filter(num -> num % 2 == 0)
.collect(Collectors.toList());
六、完整综合案例
需求:筛选名字以 "张" 开头、长度 3 的姓名,存入新集合
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三丰");
list.add("张无忌");
list.add("李四");
List<String> res = list.stream()
.filter(s -> s.startsWith("张"))
.filter(s -> s.length() == 3)
.collect(Collectors.toList());
res.forEach(System.out::println);
七、核心注意事项 ⚠️
- 流只能使用一次:执行终结操作后流关闭,重复调用会报错
- 中间操作延迟加载,无终结操作时代码不会执行
- concat 是静态方法,直接
Stream.concat(流1,流2)调用 - distinct 去重依赖实体类重写
hashCode()和equals() - 基本类型数组流有专用流:
IntStream/LongStream/DoubleStream
八、开发选型总结
- 简单遍历:普通 for 循环
- 复杂筛选、转换、多步处理:优先 Stream 流,代码极简
- 需要保存处理后数据:搭配
collect()收集到集合 - 大数据量复杂计算:并行流
stream.parallelStream()提升效率
更多推荐




所有评论(0)