目录
为什么使用 Stream 流?
在日常 Java 开发中,对于集合的处理是非常常见的需求。传统的 for 循环虽然能够满足这一需求,但 JDK 1.8 引入的 Stream 流提供了更为强大、简洁和易读的方式来操作集合。
在系统中有无数的for循环,每次看for循环都得一步一步看到底循环操作了啥,太烦了。
Stream流:
-
简洁性:Stream 流提供了一套丰富的 API,可以通过链式操作(例如:.map().filter())完成多种集合操作,减少了繁琐的迭代和条件判断,代码更加简洁。
-
可读性:Stream 流的操作方式更贴近自然语言,让代码更易读、易懂。相较于传统的 for 循环,Stream 流更注重描述你想要实现的目标,而不是过程。例如:看到.filter()就知道是在筛选,看到.collect()就知道在生成集合。
-
并行处理:Stream 流天生支持并行处理,可以更充分地利用多核处理器,提高处理效率,而传统的 for 循环在并发处理上较为繁琐。
代码示例
考虑一个场景,我们有一个学生列表 List<Student>
,现在需要筛选出年龄大于 18 的并且重复的学生姓名,并构成一个新的列表。
使用 Stream 流
List<Student> students = // 从某处获取学生列表
List<Student> adults = students.stream()
.filter(student -> student.getAge() > 18)
.distinct()
.collect(Collectors.toList());
使用传统 for 循环
List<Student> students = // 从某处获取学生列表
List<Student> adults = new ArrayList<>();
for (Student student : students) {
if (student.getAge() > 18) {
if (adults.contains(student)){
adults.add(student);
}
}
}
Stream 流用法讲解
常见中间操作
-
filter:筛选元素。
List<Student> adults = students.stream() .filter(student -> student.getAge() > 18) .distinct() .collect(Collectors.toList());
-
map:对元素进行转换。
List<String> names = students.stream() .map(Student::getName) .collect(Collectors.toList());
常见终端操作
-
collect:将流转换为其他形式,通常是集合。
List<String> names = students.stream() .map(Student::getName) .collect(Collectors.toList());
-
forEach:遍历流中的元素。
students.stream() .forEach(student -> System.out.println(student.getName()));
Stream 流相对于 for 循环的便利之处
-
简洁性:Stream 流通过链式操作将多个操作连接在一起,避免了传统 for 循环中的繁琐语法。
-
功能性:Stream 提供了丰富的中间操作和终端操作,比如 filter、map、collect 等,能够完成更多高级的集合操作。
-
并行处理:Stream 流天生支持并行处理,提高了处理大数据集合时的效率,而 for 循环需要手动处理并发问题。
总结
通过这个例子,我们清晰地看到了 Stream 流相对于传统 for 循环的优势。在日常开发中,特别是对集合进行筛选、转换、聚合等操作时,Stream 流提供了更为便捷、灵活和高效的方式。当然,在选择使用 Stream 流时,也需要根据实际情况权衡性能和可读性。
通过逐步深入的讲解,相信读者对 JDK 1.8 中的 Stream 流已经有了更清晰的认识。在实际项目中,合理运用。
推荐阅读:
最后我还整理汇总了⼀些 Java ⾯试相关的⾼质量 PDF 资料和免费Idea账号
公众号:Java小白,回复“⾯试” 和“idea破解”即可获取!