函数式接口Predicate
软件包 java.util.function
Interface Predicate<T>
Predicate 接口用来判断传递的参数是否满足条件,并返回一个布尔值
方法摘要 |
---|
返回值类型 | 方法 | 描述 |
---|---|---|
default Predicate | and(Predicate<? super T> other) | 返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑AND。 |
static Predicate | isEqual(Object targetRef) | 返回一个谓词,根据 Objects.equals(Object, Object)测试两个参数是否相等。 *不常用 |
default Predicate | negate() | 返回表示此谓词的逻辑否定的谓词。 |
default Predicate | or(Predicate<? super T> other) | 返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑或。 |
boolean | test(T t) | 在给定的参数上评估这个谓词。 |
- test()方法:对给定的参数进行逻辑判断,并返回布尔值
import java.util.ArrayList;
import java.util.function.Predicate;
public class PredicateDemo01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张无鸡");
list.add("狄仁杰");
list.add("卡萨丁");
list.add("张彪");
list.add("黄宇轩");
list.add("李仁杰");
//找出列表中的"张彪"
//增强for遍历列表
for (String name : list){
//使用lambda表达式来实现test()方法的逻辑判断
if (checkName(name, s -> "张彪".equals(name))) {
System.out.println(name);
break;
}
}
}
private static boolean checkName(String name, Predicate<String> pre){
//调用test()方法,进行逻辑判断,并返回布尔值
return pre.test(name);
}
}
- and()方法:对给定参数的两个不同条件精选逻辑判断,并把两次判断结果 逻辑与(&&) 后返回一个布尔值
import java.util.ArrayList;
import java.util.function.Predicate;
public class PredicateDemo01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张无鸡,男");
list.add("狄杰,男");
list.add("卡萨丁,女");
list.add("张彪,男");
list.add("黄轩,女");
list.add("李仁杰,女");
//找出列表中的长度为 2 且 性别为"男"的名字
//增强for遍历列表
for (String name : list) {
//以逗号分割字符串
String[] split = name.split(",");
//判断是名字长度是否为2
boolean flag = split[0].length() == 2;
//判断性别是否为男
boolean gender = "男".equals(split[1]);
//对以上条件进行逻辑与运算,并输出结果
if (flag && gender)
System.out.println("简单实现:\t\t\t" + name);
//调用checkName方法,并用lambda表达式优化代码
if (checkName(name, s -> name.split(",")[0].length() == 2,
s -> "男".equals(name.split(",")[1])))
System.out.println("Predicate接口实现:\t" + name);
}
}
private static boolean checkName(String name, Predicate<String> pre1, Predicate<String> pre2) {
// //调用两次test()方法,进行逻辑判断
// boolean test1 = pre1.test(name);
// boolean test2 = pre2.test(name);
// //返回两次判断的逻辑与结果
// return (test1 && test2);
//使用 and() 方法对以上代码进行优化
return pre1.and(pre2).test(name);
}
}
- or()方法:对给定参数的两个不同条件精选逻辑判断,并把两次判断结果 逻辑或(||) 后返回一个布尔值
import java.util.ArrayList;
import java.util.function.Predicate;
public class PredicateDemo01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张无鸡,男");
list.add("狄杰,男");
list.add("卡萨丁,女");
list.add("张彪,男");
list.add("黄轩,女");
list.add("李仁杰,女");
//找出列表中的长度为 或者 性别为"男"的名字
//增强for遍历列表
for (String name : list) {
//调用checkName方法,并用lambda表达式优化代码
if (checkName_or(name, s -> name.split(",")[0].length() == 2,
s -> "男".equals(name.split(",")[1])))
System.out.println(name);
}
}
private static boolean checkName_or(String name, Predicate<String> pre1, Predicate<String> pre2) {
// //调用两次test()方法,进行逻辑判断
// boolean test1 = pre1.test(name);
// boolean test2 = pre2.test(name);
// //返回两次判断的逻辑与结果
// return (test1 || test2);
//使用 or() 方法对以上代码进行优化
return pre1.or(pre2).test(name);
}
}
- negate()方法:对给定的参数进行逻辑判断后,取反
import java.util.function.Predicate;
public class PredicateDemo02 {
public static void main(String[] args) {
int[] num = {10, 22, 73, 51, 9, 53, 57};
//将num数组中不是2的倍数的数字输出
for (int n : num){
//使用lambda表达式实现
if (checkNum(n, i -> i % 2 == 0))
System.out.println(n);;
}
}
private static boolean checkNum(int n, Predicate<Integer> pre){
//判断数字是否为2的倍数,取反后返回
return pre.negate().test(n);
}
}