关于java:Java-8函数式接口之Predicate用法

8次阅读

共计 2816 个字符,预计需要花费 8 分钟才能阅读完成。

在 Java 8 中,Predicate<T> 是一个函数式接口,用于对某个类型的对象进行条件判断,返回一个布尔值。


Predicate<T> 接口定义如下:

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);
}

Predicate<T> 接口只有一个形象办法 test,该办法承受一个泛型参数并返回一个布尔值。你能够应用 Lambda 表达式或办法援用来实现 Predicate<T> 接口,依据本人的需要编写条件判断代码。

以下是 Predicate<T> 简略的示例用法:

Predicate<Integer> isEven = num -> num % 2 == 0;

System.out.println(isEven.test(4)); // 输入: true
System.out.println(isEven.test(7)); // 输入: false

上述示例创立了一个用于判断一个整数是否为偶数的 Predicate<Integer> 对象 isEven。通过调用 test 办法,你能够传入一个整数,而后失去对应的布尔值后果。


Predicate<T> 接口还能够与其余函数式接口联合应用,如 filter 办法配合 Stream 应用,进行元素的过滤操作。

以下是应用 Predicate<T> 进行元素过滤的示例:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class PredicateExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        Predicate<Integer> isEven = num -> num % 2 == 0;
        Predicate<Integer> isGreaterThan5 = num -> num > 5;
        
        List<Integer> filteredNumbers = numbers.stream()
                                               .filter(isEven.and(isGreaterThan5))
                                               .collect(Collectors.toList());

        System.out.println(filteredNumbers); // 输入: [6, 8, 10]
    }
}

在上述示例中,咱们应用 filter 办法联合 Predicate<T> 对流中的元素进行过滤,只保留了偶数。最终将后果收集到一个新的列表中。




Predicate<T> 接口还提供了一些默认办法,如 and、or、negate,用于进行条件的组合、取反等操作。

以下是三个默认办法的阐明和示例:

1. and(Predicate<? super T> other):返回一个组合判断条件,要同时满足以后条件和传入的另一个条件。

import java.util.function.Predicate;

public class PredicateExample {public static void main(String[] args) {
        Predicate<Integer> isEven = num -> num % 2 == 0;
        Predicate<Integer> isGreaterThan5 = num -> num > 5;

        Predicate<Integer> isEvenAndGreaterThan5 = isEven.and(isGreaterThan5);

        System.out.println(isEvenAndGreaterThan5.test(6)); // 输入: true
        System.out.println(isEvenAndGreaterThan5.test(3)); // 输入: false
    }
}

上述示例中,咱们创立了两个 Predicate<Integer> 对象 isEven 和 isGreaterThan5,别离用于判断数字是否为偶数和是否大于 5。而后咱们应用 and 办法将这两个条件进行逻辑与操作,生成了一个新的 Predicate<Integer> 对象 isEvenAndGreaterThan5。通过调用 test 办法,咱们能够查看一个数字是否同时满足偶数和大于 5 的条件。

2. or(Predicate<? super T> other):返回一个组合判断条件,满足以后条件或者传入的另一个条件即可。

import java.util.function.Predicate;

public class PredicateExample {public static void main(String[] args) {
        Predicate<Integer> isEven = num -> num % 2 == 0;
        Predicate<Integer> isGreaterThan5 = num -> num > 5;

        Predicate<Integer> isEvenOrGreaterThan5 = isEven.or(isGreaterThan5);

        System.out.println(isEvenOrGreaterThan5.test(4)); // 输入: true
        System.out.println(isEvenOrGreaterThan5.test(7)); // 输入: true
        System.out.println(isEvenOrGreaterThan5.test(3)); // 输入: false
    }
}

在上述示例中,咱们应用 or 办法将 isEven 和 isGreaterThan5 这两个条件进行逻辑或操作,生成了一个新的 Predicate<Integer> 对象 isEvenOrGreaterThan5。通过调用 test 办法,咱们能够查看一个数字是否满足偶数或者大于 5 的条件。

3. negate():返回以后判断条件的取反条件。

import java.util.function.Predicate;

public class PredicateExample {public static void main(String[] args) {
        Predicate<Integer> isEven = num -> num % 2 == 0;

        Predicate<Integer> isNotEven = isEven.negate();

        System.out.println(isNotEven.test(3)); // 输入: true
        System.out.println(isNotEven.test(4)); // 输入: false
    }
}

在上述示例中,咱们应用 negate 办法对 isEven 条件进行取反操作,生成了一个新的 Predicate<Integer> 对象 isNotEven。通过调用 test 办法,咱们能够查看一个数字是否不满足偶数的条件。

正文完
 0