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

相关推荐
方也_arkling6 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮6 小时前
Spring Bean作用域与生命周期全解析
java·spring
Chengbei116 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1126 小时前
web-第一次课后作业
java·开发语言·idea
秋96 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本6 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
DIY源码阁7 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
不总是7 小时前
Windows 系统 Node.js 免安装版(zip)安装与配置教程(2026 最新)
前端·windows·node.js
basketball6168 小时前
C++ NULL 和 nullptr 区别 以及 nullptr 的核心实现
java·开发语言·c++
JAVA面经实录9178 小时前
MyBatis面试题库
java·mybatis