什么是 Stream?
Stream 是 Java 8 引入的数据处理工具,用于对集合(List、Set 等)或数组进行函数式操作,如过滤、映射、排序、统计等。
它不是数据结构,不存储数据,而是对数据的流水线操作。
三大步骤
获取流(Source)
中间操作(Intermediate Operations)—— 返回新流,可链式调用
终止操作(Terminal Operation)—— 触发执行,返回结果
list.stream() // 1. 获取流 .filter(s -> s.length() > 3) // 2. 中间操作:过滤 .map(String::toUpperCase) // 2. 中间操作:转换 .sorted() // 2. 中间操作:排序 .forEach(System.out::println); // 3. 终止操作:打印
常用方法
中间操作(返回 Stream,可链式调用)
方法 | 说明 |
| 过滤:保留符合条件的元素 |
| 转换:将元素转换成另一种形式 |
| 扁平化:将流中的流合并成一个流 |
| 去重 |
| 排序 |
| 限制前 n 个元素 |
| 跳过前 n 个元素 |
终止操作(触发执行,返回结果)
方法 | 说明 |
| 遍历每个元素 |
| 收集结果(如转为 List、Set) |
| 统计数量 |
| 匹配判断 |
| 查找元素 |
| 聚合计算(如求和) |
实用示例
List<String> list = Arrays.asList("apple", "banana", "cherry", "date"); // 1. 过滤长度 > 5 的,并转大写 List<String> result = list.stream() .filter(s -> s.length() > 5) .map(String::toUpperCase) .collect(Collectors.toList()); // 2. 求所有字符串长度总和 int sum = list.stream() .mapToInt(String::length) .sum(); // 3. 判断是否有以 "a" 开头的 boolean hasA = list.stream().anyMatch(s -> s.startsWith("a"));
特点
不修改原集合:操作产生新流或结果。
惰性执行:中间操作不立即执行,直到终止操作触发。
支持并行流:
parallelStream()
可自动多线程处理,提升性能(注意线程安全)。
list.parallelStream().filter(...).forEach(...); // 自动并行
适用场景
数据过滤、转换、统计
集合处理代码更简洁、函数式
大数据量处理(配合并行流)
总结
Stream = 源 + 中间操作(流水线) + 终止操作(触发执行)
优势:代码简洁、可读性强、支持函数式编程、易于并行处理。
建议:替代传统 for 循环做集合处理,提升开发效率。
0条评论
点击登录参与评论