Java 8 Stream流:从入门到“真香”
【摘要】 Java 8 Stream流:从入门到“真香”Java 8 引入的 Stream API 可以说是 Java 语言的一次重大升级,它让我们处理集合数据的方式从“命令式”转向了“声明式”。简单说,就是你不再需要写一堆 for 循环和 if 判断,而是像流水线一样,把数据“流”过一系列操作,最终得到想要的结果。 什么是 Stream?Stream 不是数据结构,它不存储数据,而是对数据源(如集...
Java 8 Stream流:从入门到“真香”
Java 8 引入的 Stream API 可以说是 Java 语言的一次重大升级,它让我们处理集合数据的方式从“命令式”转向了“声明式”。简单说,就是你不再需要写一堆 for 循环和 if 判断,而是像流水线一样,把数据“流”过一系列操作,最终得到想要的结果。
什么是 Stream?
Stream 不是数据结构,它不存储数据,而是对数据源(如集合、数组)进行一系列管道化处理。它有三大特征:
- 不存储数据:Stream 只是数据的“搬运工”。
- 不改变数据源:Stream 操作不会修改原始集合,而是返回一个新的结果。
- 惰性求值:中间操作(如 filter、map)不会立即执行,只有遇到终端操作(如 collect、forEach)时才会真正开始计算。
常用操作一览
1. 创建 Stream
// 从集合创建
List<String> list = Arrays.asList("Java", "Python", "Go");
Stream<String> stream = list.stream();
// 从数组创建
int[] arr = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(arr);
2. 中间操作(返回 Stream,可链式调用)
- filter:过滤,保留满足条件的元素
- map:映射,将每个元素转换为另一个值
- sorted:排序
- distinct:去重
- limit:截取前 N 个元素
List<String> result = list.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
// 结果: ["GO", "JAVA", "PYTHON"]
3. 终端操作(触发计算,返回结果)
- forEach:遍历
- collect:收集为集合
- count:计数
- reduce:归约
- anyMatch / allMatch:匹配判断
long count = list.stream()
.filter(s -> s.startsWith("J"))
.count();
// 结果: 1
实战小例子
假设有一个用户列表,要找出所有年龄大于 18 的用户名,并按字母排序:
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.sorted()
.collect(Collectors.toList());
一行代码搞定,是不是比写 for 循环清爽多了?
注意事项
- Stream 只能消费一次,用完后不能复用。
- 并行流(parallelStream)虽然能利用多核提升性能,但要注意线程安全问题,且并非所有场景都适合。
- 不要过度使用,简单的遍历用 for 循环反而更直观。
总结
Stream 的核心思想就是 “声明式编程” ——你告诉程序“我要什么”,而不是“怎么做”。熟练掌握 filter、map、collect 这三个操作,基本就能应对 80% 的日常需求了。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)