Predicate.test和直接用boolean有什么区别

发布时间 2023-06-23 15:07:48作者: 2一念轮回2

在Java中, Predicate 接口和直接使用 boolean 类型的变量的主要区别在于它们的使用场景和灵活性。

使用 boolean 类型的变量通常用于表示一个简单的逻辑条件,例如判断一个数是否为偶数。这种情况下,我们可以直接使用 if 语句或三元运算符来判断条件,并返回一个布尔值。

而 Predicate 接口则更适用于需要传递逻辑条件作为参数的情况。例如,在Java 8中,我们可以使用 Predicate 接口作为 Stream 的过滤条件,或者作为 Collection 的 removeIf 方法的参数,从而更方便地对集合中的元素进行过滤或删除操作。

下面是一个使用 Predicate 接口的例子。假设我们有一个整数列表,我们想筛选出其中的偶数。我们可以定义一个 Predicate 对象 isEven ,它接受一个整数作为输入,返回一个布尔值表示输入的数是否为偶数。然后,我们可以使用 filter 方法来筛选符合条件的元素。

 

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

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

        // 定义一个逻辑条件:判断一个数是否为偶数
        Predicate<Integer> isEven = x -> x % 2 == 0;

        // 使用 Predicate 进行过滤
        List<Integer> evenNumbers = numbers.stream()
                                            .filter(isEven)
                                            .collect(Collectors.toList());

        System.out.println(evenNumbers);  // [2, 4, 6, 8, 10]
    }
}


在上面的例子中,我们定义了一个 Predicate 对象 isEven ,它接受一个整数作为输入,返回一个布尔值表示输入的数是否为偶数。我们使用 filter 方法来筛选出符合条件的元素,并将结果收集到一个列表中。

此外,使用 Predicate 接口还可以方便地实现逻辑复合(如 and 、 or 、 negate 等操作),从而更灵活地组合多个逻辑条件。例如,我们可以定义一个 Predicate 对象 isPositiveEven ,它表示一个数既为正数又为偶数。然后,我们可以使用 and 方法将 isEven 和 isPositive 组合起来,得到一个新的 Predicate 对象 isPositiveEven 。

 

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

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

        // 定义逻辑条件:判断一个数是否为偶数、是否为正数
        Predicate<Integer> isEven = x -> x % 2 == 0;
        Predicate<Integer> isPositive = x -> x > 0;

        // 使用 and 进行逻辑复合
        Predicate<Integer> isPositiveEven = isEven.and(isPositive);

        // 使用 Predicate 进行过滤
        List<Integer> positiveEvenNumbers = numbers.stream()
                                                    .filter(isPositiveEven)
                                                    .collect(Collectors.toList());

        System.out.println(positiveEvenNumbers);  // [2, 4, 6, 8, 10]
    }
}


在上面的例子中,我们定义了两个 Predicate 对象 isEven 和 isPositive ,它们分别表示一个数是否为偶数和是否为正数。然后,我们使用 and 方法将它们组合起来,得到一个新的 Predicate 对象 isPositiveEven ,它表示一个数既为正数又为偶数。我们使用 filter 方法来筛选出符合条件的元素,并将结果收集到一个列表中。