Predicate 是 Java8 中的函数式接口,它代表一个断言,用来对输入的参数进行判断,返回一个 boolean 值。它通常用于过滤、筛选或者判断某个条件是否满足。
Predicate 接口只有一个抽象方法:boolean test(T t),该方法用于对输入的参数进行判断,并返回一个 boolean 值。
使用 Predicate 接口可以方便地实现一些条件判断的需求,例如在对集合进行筛选时,判断某个元素是否满足特定条件。另外,它也可以作为方法的参数,用于接收一个条件判断的函数。
Predicate 接口定义如下:
package java.util.function;
import java.util.Objects;
/**
* 代表一个参数断言(布尔值函数)。
* 这是一个功能接口,它的功能方法是 test(Object)。
*
* @param <T> 断言的输入类型
* @since 1.8
*/
@FunctionalInterface
public interface Predicate<T> {
/**
* 根据给定参数计算此断言
*
* @param t 输入参数
* @return 如果输入参数匹配谓词,返回 true。否则,返回 false
*/
boolean test(T t);
/**
* 返回一个组合断言,表示此断言与另一断言的短路逻辑 AND。 在评估组合断言时,如果此断言为 false,则不评估 other 断言。
*
* 在评估任一断言时抛出的任何异常都会转发给调用者;如果评估该断言时抛出异常,则不会评估 other 断言。
*
* @param other 将与该断言进行逻辑 AND 的断言
* @return 组和的断言,表示该断言与 other 断言的短路逻辑 AND
* @throws 如果对方为空,则出现 NullPointerException 异常
*/
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
/**
* 返回表示该断言逻辑的否定断言。
*
* @return 表示该断言逻辑否定的断言
*/
default Predicate<T> negate() {
return (t) -> !test(t);
}
/**
* 返回一个组合断言,表示此断言与另一断言的短路逻辑 OR。 在评估组合断言时,如果此断言为 true,则不评估 other 断言。
*
* 在评估任一断言时抛出的任何异常都会转发给调用者;如果评估该断言时抛出异常,则不会评估 other 断言。
*
* @param other 与该断言逻辑 OR 的断言
* @return 组成的断言,表示该断言和 other 断言的短路逻辑 OR
* @throws 如果对方为空,则出现 NullPointerException 异常
*/
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
/**
* 返回一个 Predicate,该断言根据 Objects#equals(Object, Object) 测试两个参数是否相等。
*
* @param <T> 断言的参数类型
* @param targetRef 对象引用,与之进行等价比较,可以是 null
* @return 断言,根据 Objects#equals(Object, Object) 测试两个参数是否相等。
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}该示例将输入一个字符串,使用 Predicate 判断字符串中是否包含 w 或 W 字符。
package com.hxstrive.jdk8.function_interface;
import java.util.function.Predicate;
/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo {
public static void main(String[] args) {
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String s) {
// 判断字符串是否包含 w 或 W
return s.toLowerCase().contains("w");
}
};
System.out.println(predicate.test("hello world"));
}
}运行示例,输出如下:
true
package com.hxstrive.jdk8.function_interface;
import java.util.function.Predicate;
/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo2 {
public static void main(String[] args) {
Predicate<String> predicate = s -> {
// 判断字符串是否包含 w 或 W
return s.toLowerCase().contains("w");
};
System.out.println(predicate.test("hello world"));
}
}运行示例,输出如下:
true
该示例将创建两个断言,两个断言是逻辑与的关系。通过这两个断言判断字符串中是否同时包含了 w 和 o 字符。如下:
package com.hxstrive.jdk8.function_interface;
import java.util.function.Predicate;
/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo3 {
public static void main(String[] args) {
Predicate<String> predicate = s -> {
// 判断字符串是否包含 w 或 W
System.out.println("(1) 判断字符串是否包含 w 或 W");
return s.toLowerCase().contains("w");
};
predicate = predicate.and(s -> {
// 继续判断字符串是否包含 o 或 O
System.out.println("(2) 继续判断字符串是否包含 o 或 O");
return s.toLowerCase().contains("o");
});
System.out.println(predicate.test("hello world"));
}
}运行示例,输出如下:
(1) 判断字符串是否包含 w 或 W (2) 继续判断字符串是否包含 o 或 O true
该示例将创建两个断言,两个断言是逻辑或的关系。通过这两个断言判断字符串中是否包含了 w 或 o 字符。如下:
package com.hxstrive.jdk8.function_interface;
import java.util.function.Predicate;
/**
* Predicate 函数式接口
* @author hxstrive.com
*/
public class PredicateDemo4 {
public static void main(String[] args) {
Predicate<String> predicate = s -> {
// 判断字符串是否包含 w 或 W
System.out.println("(1) 判断字符串是否包含 w 或 W");
return s.toLowerCase().contains("w");
};
predicate = predicate.or(s -> {
// 继续判断字符串是否包含 o 或 O
System.out.println("(2) 继续判断字符串是否包含 o 或 O");
return s.toLowerCase().contains("o");
});
System.out.println(predicate.test("hello world"));
}
}运行示例,输出如下:
(1) 判断字符串是否包含 w 或 W true