【Java】Predicate使用案例
【Java】Predicate使用案例
- 【一】Predicate 的基本用法
- 【1】案例 1:基础过滤(判断单个条件)
- 【2】案例 2:结合 Stream 过滤集合
- 【3】案例 3:组合多个 Predicate(与、或、非)
- 【4】案例 4:自定义对象的多条件查询
- 【二】核心总结
Predicate 是 Java 8 引入的函数式接口(位于 java.util.function 包),用于表示一个布尔值的判断条件,其核心方法是 test(T t),返回 boolean 结果。它常用于过滤、条件判断等场景,配合 Stream API 使用尤为方便。
【一】Predicate 的基本用法
Predicate 接收一个泛型参数 T,通过 test() 方法对参数进行判断。
常见操作包括:
(1)直接使用 lambda 表达式创建 Predicate 实例
(2)组合多个 Predicate(与、或、非)
【1】案例 1:基础过滤(判断单个条件)
需求:过滤出列表中年龄大于 18 的用户。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public int getAge() { return age; }public String getName() { return name; }@Overridepublic String toString() { return name + "(" + age + ")"; }
}public class PredicateDemo {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User("张三", 20));users.add(new User("李四", 17));users.add(new User("王五", 25));// 定义Predicate:判断年龄是否大于18Predicate<User> isAdult = user -> user.getAge() > 18;// 过滤并打印成年用户for (User user : users) {if (isAdult.test(user)) { // 调用test()方法判断System.out.println(user);}}}
}
【2】案例 2:结合 Stream 过滤集合
Predicate 与 Stream 的 filter() 方法配合,可简洁地过滤集合。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;public class PredicateStreamDemo {public static void main(String[] args) {List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);// 过滤出偶数(使用Predicate作为filter的参数)Predicate<Integer> isEven = num -> num % 2 == 0;numbers.stream().filter(isEven) // 传入Predicate.forEach(System.out::println); // 输出:2 4 6 8}
}
【3】案例 3:组合多个 Predicate(与、或、非)
Predicate 提供了默认方法用于组合条件:
(1)and(Predicate):逻辑与(两个条件都满足)
(2)or(Predicate):逻辑或(满足任一条件)
(3)negate():逻辑非(取反条件)
需求:过滤出 “年龄大于 18 且名字长度大于 2” 的用户。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;public class PredicateCombineDemo {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User("张三", 20)); // 年龄达标,名字长度2(不达标)users.add(new User("李四四", 17)); // 年龄不达标,名字长度3(达标)users.add(new User("王五五", 25)); // 两者都达标// 条件1:年龄>18Predicate<User> agePredicate = u -> u.getAge() > 18;// 条件2:名字长度>2Predicate<User> namePredicate = u -> u.getName().length() > 2;// 组合条件:年龄达标 且 名字达标(使用and())Predicate<User> combined = agePredicate.and(namePredicate);// 过滤并打印users.stream().filter(combined).forEach(System.out::println); // 输出:王五五(25)}
}
其他组合示例:
// 年龄>18 或 名字长度>2(使用or())
Predicate<User> orCombined = agePredicate.or(namePredicate);// 年龄不大于18(使用negate()取反)
Predicate<User> notAdult = agePredicate.negate();
【4】案例 4:自定义对象的多条件查询
需求:根据动态条件查询用户(如可选条件:年龄范围、姓名包含特定字符)。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;public class PredicateQueryDemo {// 根据条件查询用户public static List<User> findUsers(List<User> users, Predicate<User> predicate) {List<User> result = new ArrayList<>();for (User user : users) {if (predicate.test(user)) {result.add(user);}}return result;}public static void main(String[] args) {List<User> users = List.of(new User("张三", 20),new User("张四", 22),new User("李四", 17));// 查询:名字包含"张"且年龄>18Predicate<User> query = u -> u.getName().contains("张") && u.getAge() > 18;List<User> result = findUsers(users, query);System.out.println(result); // 输出:[张三(20), 张四(22)]}
}
【二】核心总结
(1)Predicate 用于条件判断,核心方法 test(T t) 返回布尔值。
(2)常与 Stream.filter() 配合,简化集合过滤逻辑。
(3)支持通过 and()、or()、negate() 组合多个条件,实现复杂判断。
(4)作为函数式接口,可直接用 lambda 表达式创建,代码更简洁。
通过 Predicate,可以将条件判断逻辑抽离为独立的函数,提高代码的可读性和复用性。