本文目录导读:

- Predicate 基本用法
- 组合条件:and / or / negate
- 实际业务场景:过滤列表
- 动态组合多个 Predicate
- 使用静态方法 Predicate.isEqual
- 注意点
- 完整示例:复杂条件查询(模拟)
在 Java 中,Predicate 是 java.util.function 包下的一个函数式接口,常用于过滤、条件判断等场景,它提供了一些默认方法(如 and、or、negate)来组合多个条件。
下面从基础用法到组合应用逐步说明:
Predicate 基本用法
import java.util.function.Predicate;
public class PredicateDemo {
public static void main(String[] args) {
// 定义两个基本条件
Predicate<Integer> isEven = num -> num % 2 == 0;
Predicate<Integer> isGreaterThan10 = num -> num > 10;
System.out.println(isEven.test(8)); // true
System.out.println(isGreaterThan10.test(15)); // true
}
}
组合条件:and / or / negate
public class PredicateCombine {
public static void main(String[] args) {
Predicate<Integer> isEven = num -> num % 2 == 0;
Predicate<Integer> isGreaterThan10 = num -> num > 10;
// and: 既是偶数又大于10
Predicate<Integer> evenAndGt10 = isEven.and(isGreaterThan10);
System.out.println(evenAndGt10.test(12)); // true
System.out.println(evenAndGt10.test(8)); // false
// or: 是偶数 或 大于10
Predicate<Integer> evenOrGt10 = isEven.or(isGreaterThan10);
System.out.println(evenOrGt10.test(8)); // true
System.out.println(evenOrGt10.test(9)); // false
// negate: 取反(不是偶数)
Predicate<Integer> isOdd = isEven.negate();
System.out.println(isOdd.test(5)); // true
}
}
实际业务场景:过滤列表
这是最常用的方式,结合 Stream API 使用:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class FilterDemo {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 5, 8, 12, 15, 20, 23);
Predicate<Integer> isEven = n -> n % 2 == 0;
Predicate<Integer> isGt10 = n -> n > 10;
// 组合:偶数且大于10
List<Integer> result = numbers.stream()
.filter(isEven.and(isGt10))
.collect(Collectors.toList());
System.out.println(result); // [12, 20]
}
}
动态组合多个 Predicate
当条件数量不确定时,可以用集合或数组来动态组合:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class DynamicCombine {
public static void main(String[] args) {
List<Predicate<Integer>> conditions = new ArrayList<>();
conditions.add(n -> n > 5);
conditions.add(n -> n < 20);
conditions.add(n -> n % 2 == 0);
// 合并所有条件(且关系)
Predicate<Integer> combined = conditions.stream()
.reduce(Predicate::and)
.orElse(n -> true); // 如果没有条件,默认全部通过
System.out.println(combined.test(12)); // true
System.out.println(combined.test(3)); // false
}
}
使用静态方法 Predicate.isEqual
用于比较是否等于某个固定值:
Predicate<String> isHello = Predicate.isEqual("Hello");
System.out.println(isHello.test("Hello")); // true
System.out.println(isHello.test("World")); // false
注意点
| 特性 | 说明 |
|---|---|
| 惰性求值 | and()、or() 只是返回新的 Predicate,不会立即执行 |
| 短路求值 | and 中如果第一个条件 false,后续条件不会执行(类似 &&)or 中如果第一个条件 true,后续条件不会执行(类似 ) |
| 不可变 | 原始 Predicate 不会被修改,每次组合都返回新对象 |
完整示例:复杂条件查询(模拟)
public class UserFilter {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("Alice", 25, true),
new User("Bob", 17, false),
new User("Charlie", 30, true)
);
Predicate<User> adult = u -> u.getAge() >= 18;
Predicate<User> active = u -> u.isActive();
Predicate<User> nameStartsWithA = u -> u.getName().startsWith("A");
// 组合:成年人 且 活跃用户 且(名字以A开头 或 年龄大于30)
Predicate<User> complex = adult
.and(active)
.and(nameStartsWithA.or(u -> u.getAge() > 30));
List<User> filtered = users.stream()
.filter(complex)
.collect(Collectors.toList());
filtered.forEach(System.out::println);
// 输出:Alice (25, active)
}
}
- 基础组合:
and()、or()、negate() - 批量组合:用
reduce(Predicate::and)或reduce(Predicate::or) - 常用场景:Stream 的
filter()、Optional.filter()、集合筛选 - 注意事项:短路求值、惰性求值、不可变性
掌握这些组合方式,可以写出非常灵活、可复用的条件判断逻辑。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播