java stream的filter操作通过predicate判断元素,仅保留test返回true者,生成新流不改原数据,惰性求值、支持链式调用,需配合终端操作触发执行。

Java Stream 的 filter 操作通过传入一个 Predicate(断言)函数式接口,对流中每个元素进行条件判断,只保留返回 true 的元素。它不会修改原集合,而是生成一个新流,适合链式调用和函数式风格处理。
filter 的基本用法和语法结构
filter 是中间操作,必须配合终端操作(如 collect、forEach、count)才能触发执行。它的签名是:
其中 Predicate 只有一个抽象方法 boolean test(T t),用于定义“是否留下该元素”的逻辑。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 直接写 Lambda 表达式最常见:比如
filter(x -> x > 10) - 也可复用已定义的 Predicate 变量,提升可读性和复用性
- 注意:filter 不会改变原始集合,原 List/Array 保持不变
按基础类型值精准过滤(数字、字符串等)
对简单属性或本身是基础类型的集合,条件表达清晰直观:
- 筛选大于 25 的整数:
list.stream().filter(n -> n > 25).collect(Collectors.toList()) - 筛选非空且长度大于 3 的字符串:
strings.stream().filter(s -> s != null && s.length() > 3).toList()(Java 16+) - 忽略大小写匹配前缀:
names.stream().filter(n -> n.toLowerCase().startsWith("a")).collect(...)
按对象字段或复杂逻辑过滤
对对象集合,通常通过点号访问字段,组合多个条件时推荐用括号明确优先级:
- 筛选状态为 ACTIVE 且金额大于 100 的订单:
orders.stream().filter(o -> "ACTIVE".equals(o.getStatus()) && o.getAmount() > 100).collect(...) - 排除 null 字段再比较:
users.stream().filter(u -> u.getProfile() != null && u.getProfile().getAge() >= 18) - 用方法引用简化已有判断逻辑:
products.stream().filter(Product::isInStock).collect(...)(前提是isInStock()返回 boolean)
结合其他 Stream 操作实现精准控制
filter 常与 map、sorted、limit 等串联使用,形成数据处理流水线:
- 先过滤再提取字段:
orders.stream().filter(o -> o.getTotal() > 500).map(Order::getCustomerId).distinct().collect(...) - 按条件过滤后取前 N 条:
logs.stream().filter(log -> log.getLevel().equals("ERROR")).limit(10).forEach(System.out::println) - 多条件分步过滤更易维护:
stream.filter(isValid()).filter(hasPermission()).filter(isRecent())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










