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