Java中filter()通过Predicate接口过滤集合,true保留、false丢弃;需配合collect等终止操作;支持对象属性过滤、多条件组合(and/or/negate)及空值防护(Objects::nonNull)。

Java 中用 stream().filter() 过滤集合元素,核心是传入一个 Predicate(谓词)函数式接口,它接收元素并返回 boolean 值:返回 true 的元素保留,false 的被丢弃。
基本用法:过滤满足条件的元素
调用 collection.stream().filter(...) 后必须终止操作(如 collect()、forEach() 等),否则不会执行。
- 例如,从
List<Integer>中筛选出偶数:
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 结果:[2, 4, 6]
过滤对象集合:基于字段或方法判断
对自定义对象(如 User)过滤时,常按属性值或业务逻辑判断。
- 筛选年龄大于 18 的用户:
.filter(user -> user.getAge() > 18)
.collect(Collectors.toList());
- 筛选用户名非空且长度大于 3 的用户:
.filter(u -> u.getName() != null && u.getName().length() > 3)
.collect(Collectors.toList());
组合多个过滤条件
可用 Predicate.and()、Predicate.or()、Predicate.negate() 组合逻辑,提升可读性与复用性。
立即学习“Java免费学习笔记(深入)”;
- 先定义单个条件:
Predicate<User> hasEmail = u -> u.getEmail() != null && u.getEmail().contains("@");
- 组合使用:
.filter(isAdult.and(hasEmail))
.collect(Collectors.toList());
注意空值与异常安全
filter() 不会自动处理 null 元素,若集合含 null,且 lambda 中直接调用方法(如 n.toString()),会抛 NullPointerException。
- 安全写法:显式检查
null - 或先用
filter(Objects::nonNull)排除空值
List<String> nonNullUppers = strings.stream()
.filter(Objects::nonNull)
.filter(s -> s.length() > 2)
.map(String::toUpperCase)
.collect(Collectors.toList());


















