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

相关推荐
直奔標竿几秒前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
生而为虫23 分钟前
Claude Code 最新版安装教程(Windows/Mac/Linux 全平台) 面向普通用户的 Claude Code 安装与模型接入指南
linux·windows·macos
qq_5895681024 分钟前
java基础学习,案例练习,即时通讯
java·开发语言·学习
DevilSeagull34 分钟前
Windows 批处理 (Batch) 编程: 从入门到入土. (一) 基础概念与环境配置
开发语言·windows·后端·batch·语言
逸Y 仙X40 分钟前
文章十九: ElasticSearch Full Text 全文本查询
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
AI科技星40 分钟前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
0xDevNull1 小时前
Java泛型详解
java·开发语言·后端
嘻嘻哈哈樱桃1 小时前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法
AI进化营-智能译站1 小时前
ROS2 C++开发系列13-运算符重载让ROS2消息处理更自然
java·开发语言·c++·ai
shjita1 小时前
java根据键值对中值的大小进行排序的手法。
java·开发语言·servlet