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

相关推荐
范什么特西6 小时前
打开idea项目
java
黎雁·泠崖6 小时前
Java入门从零起步:CMD操作+JDK环境搭建+第一个Java程序
java·开发语言
我的golang之路果然有问题6 小时前
python中 unicorn 热重启问题和 debug 的 json
java·服务器·前端·python·json
码农小卡拉6 小时前
深度解析 Spring Boot 启动运行机制
java·spring boot·后端
weixin_448119946 小时前
如何装docker
java·云原生·eureka
钦拆大仁6 小时前
如何手搓一个Spring Security
java·后端·spring
yaoxin5211236 小时前
288. Java Stream API - 创建随机数的 Stream
java·开发语言
kylezhao20196 小时前
C#根据时间加密和防止反编译
java·前端·c#
Assby6 小时前
Java异常体系结构
java·后端
天天睡大觉7 小时前
Python学习7
windows·python·学习