Predicate 是 Java 8 引入的函数式接口,仅含 boolean test(T t) 方法,用于判断元素是否满足条件;filter 依据其返回值筛选流中元素,支持 Lambda、方法引用、匿名类及复用变量等写法,并需注意 null 处理与无副作用原则。

Java 中 Stream.filter() 方法通过传入一个 Predicate 接口实例来决定哪些元素保留、哪些被剔除——只要 Predicate.test() 返回 true,该元素就进入下游流。
Predicate 是什么?
Predicate<t></t> 是 Java 8 引入的函数式接口,只定义了一个抽象方法:boolean test(T t)。
它代表“对某个类型对象做判断,返回布尔值”的逻辑。filter 正是靠这个返回值筛选元素。
常见写法示例
以下几种方式都等价,核心都是提供一个能返回 true 或 false 的判断逻辑:
- 使用 Lambda 表达式(最常用):
list.stream().filter(x -> x > 10)—— 留下大于 10 的数字 - 使用方法引用:
list.stream().filter(String::isEmpty)—— 留下空字符串 - 使用匿名内部类(较少用,但有助于理解):
filter(new Predicate<integer>() { public boolean test(Integer n) { return n % 2 == 0; } })</integer> - 复用已定义的 Predicate 变量:
Predicate<String> isLong = s -> s.length() > 5;<br> stream.filter(isLong)
注意 null 和副作用
filter 本身不处理 null,如果流中可能含 null,Predicate 内需主动判空,否则可能抛 NullPointerException:stream.filter(Objects::nonNull).filter(s -> s.startsWith("A"))
或者在 lambda 中直接检查:stream.filter(s -> s != null && s.length() > 0)
另外,Predicate 应是无状态、无副作用的纯函数:不要在里面修改外部变量、不要打印日志、不要调用随机数或当前时间——这会破坏流的可并行性和结果一致性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
组合多个条件
可以利用 Predicate 接口自带的默认方法链式组合:
立即学习“Java免费学习笔记(深入)”;
-
and():逻辑与filter(age > 18).and(name.startsWith("A")) -
or():逻辑或filter(s -> s.contains("a")).or(s -> s.contains("b")) -
negate():取反
Predicate<Integer> even = n -> n % 2 == 0;<br> filter(even.negate())
→ 留下奇数

















