想要精通Java8编程?学会Predicate接口,轻松搞定条件判断!

2023-07-09 16:12:08 浏览数 (3)

Predicate函数式接口的主要作用就是提供一个test方法,接受一个参数返回一个布尔类型, 在stream API中进行一些判断的时常用。

代码语言:javascript复制
/**
表示一个参数的谓词(布尔值函数)。
这是一个功能接口,其 功能 方法是 test(Object)。
 */
@FunctionalInterface
public interface Predicate<T> {

		// 根据给定参数计算此谓词
    boolean test(T t);

    /**
    and方法接收一个Predicate类型,也就是将传入的条件和当前条件以并且的关系过滤数据
     */
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    /**
    negate就是将当前条件取反。
     */
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    /**
    or方法同样接收一个Predicate类型,将传入的条件和当前的条件以或者的关系过滤数据
     */
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    /**
    返回一个谓词,该谓词根据 测试 Objects.equals(Object, Object)两个参数是否相等。
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

使用泛型T指定传入的参数类型。不同条件取出不同数据的示例:

代码语言:javascript复制
public class PredicateTest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        PredicateTest predicateTest = new PredicateTest();
        //输出大于5的数字
        List<Integer> result = predicateTest.conditionFilter(list, integer -> integer > 5);
        result.forEach(System.out::println);
        System.out.println("-------");
        //输出大于等于5的数字
        result = predicateTest.conditionFilter(list, integer -> integer >= 5);
        result.forEach(System.out::println);
        System.out.println("-------");
        //输出小于8的数字
        result = predicateTest.conditionFilter(list, integer -> integer < 8);
        result.forEach(System.out::println);
        System.out.println("-------");
        //输出所有数字
        result = predicateTest.conditionFilter(list, integer -> true);
        result.forEach(System.out::println);
        System.out.println("-------");
    }
    //高度抽象的方法定义,复用性高
    public List<Integer> conditionFilter(List<Integer> list, Predicate<Integer> predicate){
        return list.stream().filter(predicate).collect(Collectors.toList());
    }
}

定义conditionFilter方法,stream()会将当前list作为源创建一个Stream对象,collect(Collectors.toList())将最终结果封装在ArrayList,filter方法接收一个Predicate类型参数用于对目标集合进行过滤。

把要处理的数据和具体的逻辑通过参数传递给conditionFilter。

例子返回true的条件意味着打印出集合中所有元素。

具体使用

代码语言:javascript复制
public List<Integer> conditionFilterNegate(List<Integer> list, Predicate<Integer> predicate){
    return list.stream().filter(predicate.negate()).collect(Collectors.toList());
}

public List<Integer> conditionFilterAnd(List<Integer> list, Predicate<Integer> predicate,Predicate<Integer> predicate2){
    return list.stream().filter(predicate.and(predicate2)).collect(Collectors.toList());
}

public List<Integer> conditionFilterOr(List<Integer> list, Predicate<Integer> predicate,Predicate<Integer> predicate2){
    return list.stream().filter(predicate.or(predicate2)).collect(Collectors.toList());
}

//大于5并且是偶数
result = predicateTest.conditionFilterAnd(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0);

//大于5或者是偶数
result = predicateTest.conditionFilterOr(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0);

//条件取反
result = predicateTest.conditionFilterNegate(list,integer2 -> integer2 > 5);

isEqual得到的也是一个用来进行条件判断的函数式接口实例。而返回的这个函数式接口实例是通过传入的targetRef的equals方法进行判断的。

代码语言:javascript复制
System.out.println(Predicate.isEqual("test").test("test"));//true

这里会用第一个"test"的equals方法判断与第二个"test"是否相等,结果true。

0 人点赞