文章目录
- [268. Java Stream API 入门指南](#268. Java Stream API 入门指南)
-
-
- [🎯 为什么要学习 Stream API?](#🎯 为什么要学习 Stream API?)
- [🔍 Stream API 的几个核心特点](#🔍 Stream API 的几个核心特点)
-
- [✅ 流的来源不仅限于集合!](#✅ 流的来源不仅限于集合!)
- [✅ 流是懒加载的(`lazy evaluation`)](#✅ 流是懒加载的(
lazy evaluation))
- [📦 示例讲解:按字符串长度分组并计数](#📦 示例讲解:按字符串长度分组并计数)
-
- [✅ 输出结果:](#✅ 输出结果:)
- [🔍 分析说明:](#🔍 分析说明:)
- [🧠 Stream 的基本使用流程](#🧠 Stream 的基本使用流程)
-
- [📌 示例:找出长度大于 3 的字符串并转换为大写:](#📌 示例:找出长度大于 3 的字符串并转换为大写:)
- [🔧 常用中间操作](#🔧 常用中间操作)
- [✅ 常用终止操作](#✅ 常用终止操作)
- [💡 小练习题(课堂互动可用)](#💡 小练习题(课堂互动可用))
- [📌 总结 Stream API 的优势](#📌 总结 Stream API 的优势)
-
268. Java Stream API 入门指南
🎯 为什么要学习 Stream API?
在 Java 8 中,Stream API 是继 Lambda 表达式之后最重要的特性之一。它实现了一个在函数式编程中非常著名的模式 ------ Map-Filter-Reduce(映射-过滤-归约)。
📦 简单理解:
集合框架(Collections Framework) 负责将数据存储在JVM内存中,而
Stream API则是用来高效、优雅地处理这些数据。
🔍 Stream API 的几个核心特点
✅ 流的来源不仅限于集合!
- 可以从集合、数组、
I/O、生成器、自定义数据源等创建流。 - 使用方式统一,处理过程一致,代码更简洁!
✅ 流是懒加载的(lazy evaluation)
- 只有在你调用"终止操作"(如
collect()、count()等)时,流才真正被计算。 - 这意味着你可以组合多个操作(
map、filter、sort等),它们只在最终需要结果时才执行。
📦 示例讲解:按字符串长度分组并计数
java
List<String> strings = List.of("one", "two", "three", "four");
Map<Integer,Long> map = strings.stream()
.collect(Collectors.groupingBy(
String::length, // 按字符串长度分组
Collectors.counting() // 每组中元素数量
));
map.forEach((key, value) -> System.out.println(key + " :: " + value));
✅ 输出结果:
java
3 :: 2
5 :: 1
4 :: 1
🔍 分析说明:
groupingBy(String::length):按字符串长度进行分组。counting():统计每组中有多少个元素。Map<Integer, Long>:生成的Map键是字符串长度,值是对应数量。
🧠 Stream 的基本使用流程
我们来套用 Stream 的典型三步流程进行理解:
java
数据源 ➜ 中间操作(map/filter/sorted)➜ 终止操作(collect/forEach/count)
📌 示例:找出长度大于 3 的字符串并转换为大写:
java
List<String> words = List.of("Java", "is", "awesome", "and", "fun");
List<String> result = words.stream()
.filter(s -> s.length() > 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出: [JAVA, AWESOME]
🔧 常用中间操作
| 操作 | 说明 | 示例 |
|---|---|---|
filter |
过滤元素 | .filter(s -> s.length() > 3) |
map |
转换元素 | .map(String::toUpperCase) |
sorted |
排序 | .sorted(Comparator.reverseOrder()) |
distinct |
去重 | .distinct() |
limit |
取前 N 个 | .limit(5) |
skip |
跳过前 N 个 | .skip(2) |
✅ 常用终止操作
| 操作 | 说明 | 示例 |
|---|---|---|
collect |
收集结果(转为 List、Map) |
.collect(Collectors.toList()) |
forEach |
遍历结果 | .forEach(System.out::println) |
count |
统计数量 | .count() |
findFirst |
找到第一个元素(Optional) |
.findFirst() |
anyMatch |
是否存在满足条件的元素 | .anyMatch(s -> s.contains("a")) |
💡 小练习题(课堂互动可用)
1️⃣ 从一组单词中过滤出以 "
a" 开头的单词,并转为小写,收集成列表2️⃣ 给一组整数列表,保留偶数,求其平方并排序输出
3️⃣ 给一个字符串列表,统计每种长度的字符串数量
📌 总结 Stream API 的优势
| 特性 | 优势说明 |
|---|---|
| 声明式 | 更少的样板代码,代码意图清晰 |
| 可组合 | 中间操作可任意组合,构建复杂逻辑更简单 |
| 性能优化 | 延迟计算、短路操作、可并行 |
| 可拓展性强 | 可用于集合、数组、文件、数据库结果等 |