文章目录
- [274. Java Stream API - 过滤操作(filter):筛选你想要的数据](#274. Java Stream API - 过滤操作(filter):筛选你想要的数据)
-
-
- [🧠 什么是过滤(Filtering)?](#🧠 什么是过滤(Filtering)?)
- [✅ 基本示例:过滤字符串长度为 3 的元素](#✅ 基本示例:过滤字符串长度为 3 的元素)
- [🧪 扩展示例:直接过滤字符串本身](#🧪 扩展示例:直接过滤字符串本身)
- [🤖 filter 可用于所有类型的流,包括原始类型流](#🤖 filter 可用于所有类型的流,包括原始类型流)
- [💬 提示与最佳实践](#💬 提示与最佳实践)
- [🧠 小结](#🧠 小结)
-
- [🎓 练习题建议(课堂可选)](#🎓 练习题建议(课堂可选))
-
274. Java Stream API - 过滤操作(filter):筛选你想要的数据
🧠 什么是过滤(Filtering)?
在 Java Stream 中,**过滤(filter)*的作用就是*排除不满足条件的元素,只保留你感兴趣的部分。
它接收一个 Predicate (返回 true 或 false 的布尔函数),来判断每个元素是否应该保留。
✅ 基本示例:过滤字符串长度为 3 的元素
java
List<String> strings = List.of("one", "two", "three", "four");
long count = strings.stream()
.map(String::length)
.filter(length -> length == 3)
.count();
System.out.println("count = " + count);
📌 输出:
java
count = 2
🎯 说明:
map(String::length):将字符串映射为它们的长度filter(length -> length == 3):只保留长度为 3 的值count():统计最终保留下来的元素个数,是一个终端操作
📢 count() 返回的是 long 类型 ------ 比 int 更大,因此可以统计极大量的元素,比 ArrayList 所能存储的数量还多!
🧪 扩展示例:直接过滤字符串本身
你也可以不使用 map(),而是直接在字符串上使用 filter():
java
List<String> strings = List.of("one", "two", "three", "four");
List<String> filtered = strings.stream()
.filter(s -> s.length() == 3)
.toList();
System.out.println("filtered = " + filtered);
📌 输出:
java
filtered = [one, two]
💡 你可以看到,这种写法更直观,因为我们直接在原始元素(字符串)上应用判断逻辑。
🤖 filter 可用于所有类型的流,包括原始类型流
也就是说,它不仅支持 Stream<T>,还支持:
IntStreamLongStreamDoubleStream
✅ 示例:过滤整数列表中大于 10 的数字
java
List<Integer> numbers = List.of(5, 8, 13, 21, 3);
List<Integer> result = numbers.stream()
.filter(n -> n > 10)
.toList();
System.out.println("result = " + result);
输出:
java
result = [13, 21]
💬 提示与最佳实践
| 场景 | 推荐操作 |
|---|---|
| 保留满足条件的元素 | 使用 filter(predicate) |
| 想要直接数数量 | 接 .count()(返回 long) |
| 需要获得新集合 | 接 .toList()、.toSet() 等 |
| 想对数值进行统计或运算 | 推荐结合 mapToInt() 等一起使用 |
🧠 小结
filter()是一个 中间操作,返回的是一个新流(并不立即执行)- 它只保留返回值为
true的元素 - 搭配
.count()可以快速统计满足条件的元素数量 - 可用于对象流与原始类型流
- 保持函数式风格:尽量避免在
filter()中写带副作用的代码
🎓 练习题建议(课堂可选)
问题 1: 以下代码输出什么?
java
List<String> data = List.of("apple", "bat", "cat", "dog", "elephant");
long count = data.stream()
.filter(s -> s.length() <= 3)
.count();
System.out.println(count);
答案:3("bat", "cat", "dog")