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