274. Java Stream API - 过滤操作(filter):筛选你想要的数据

文章目录

  • [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 (返回 truefalse 的布尔函数),来判断每个元素是否应该保留。


✅ 基本示例:过滤字符串长度为 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>,还支持:

  • IntStream
  • LongStream
  • DoubleStream

✅ 示例:过滤整数列表中大于 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")

相关推荐
景川呀2 小时前
Java的类加载器
java·开发语言·java类加载器
小白勇闯网安圈2 小时前
Java面向对象(上)
java
一点晖光2 小时前
maven推送项目到harhor私有仓库
java·maven
代码or搬砖2 小时前
MySQL窗口函数 OVER()讲解
java·mysql
love530love3 小时前
ComfyUI 升级 v0.4.0 踩坑记录:解决 TypeError: QM_Queue.task_done() 报错
人工智能·windows·python·comfyui
静心观复3 小时前
Java 中,`1 << 1`
java·开发语言
爱睡觉的王宇昊3 小时前
单体架构详细解析:从概念到实践--购物网站搭建
java·spring boot·架构·团队开发·个人开发·敏捷流程
不思念一个荒废的名字3 小时前
【黑马JavaWeb+AI知识梳理】Web后端开发04-登录认证
java·后端
java1234_小锋3 小时前
Redis到底支不支持事务啊?
java·数据库·redis