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 (返回 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>,还支持:

  • 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")

相关推荐
wangbing11251 小时前
平台介绍-modbus设备调试
java
如若1231 小时前
Windows SSH + Headscale/Tailscale 组网及免密登录完整配置教程
运维·windows·ubuntu·ssh·内网穿透
西索斯coding1 小时前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai
wuminyu2 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
Flynn Liang2 小时前
大模型怎么自己调函数?Spring AI 2.0 Tool Calling 自动循环原理 + 完整时序图
java·人工智能·spring·agent·函数调用·springai·toolcalling
ITHAOGE153 小时前
下载 | Win11 25H2 官方正式版ISO映像!(10月更新、消费者版/专业版、商业版/企业版、26200.9711)
windows·科技·微软·电脑
John_Hui3 小时前
Windows 10 安装版本:mysql-8.1.0-winx64.zip
数据库·windows·mysql
kingx33 小时前
Windows Server安全配置深度复盘:关键 Payload 与解题思路
windows·靶场·web·加固
乌暮3 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring
技术人生0013 小时前
DirectX修复工具下载安装教程-Windows系统游戏dll修复工具下载安装修复教程
windows·游戏