Java 中的 Predicate 是什么

Mohammad Irfan 2023年10月12日
  1. Java 中的 Predicate 是什么
  2. Java Stream 的 Filter() 操作中的 Predicate
Java 中的 Predicate 是什么

本教程通过 Java 示例介绍 Predicate 接口。

Predicate 是 Java 中的一个接口,用作 lambda 表达式或方法引用的目标赋值。它被添加到 Java 8 中,并为用 Java 编写代码提供了一种更实用的方法。

它存在于 java.util.function 包中。Predicate 最常用于过滤对象流。在本教程中,我们将讨论 Predicate 是什么以及如何使用它。

Java 中的 Predicate 是什么

如前所述,Predicate 是用作 lambda 表达式或方法引用的赋值目标的功能接口。Predicate 接口的语法如下所示。

@FunctionalInterface public interface Predicate<T>

TPredicate 接口的输入类型。让我们举个例子来说明 Predicate 是什么。在数学世界中,Predicate 可以采用以下形式:

x -> x > 90

上面的语句表示,x 意味着 x 大于 90

让我们看一个如何创建 Predicate 对象的示例。

Predicate<Integer> noGreaterThan5 = x -> x > 5;

在上面的代码中,我们创建了一个名为 noGreaterThan5Predicate。该 Predicate 采用整数输入;因此,T 在这里是整数。该 Predicate 将检查输入参数是否大于 5。

Java Stream 的 Filter() 操作中的 Predicate

Java 8 流 API 的 filter() 操作将 Predicate 作为其参数。在下面的代码中,我们将使用 filter() 操作来查看 Predicate 接口的实现。看下面的代码:

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

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameGreaterThan4 = x -> x.length() > 4;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameGreaterThan4).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

输出:

[Karan, Aarya, Rahul, Pranav]

我们已经编写了上面的代码来过滤长度大于 4 的名称。我们首先创建一个 Predicate 和一个 List 来存储名称。

然后我们使用 List.toStream() 方法创建一个名称流并应用 filter() 操作。过滤操作将 nameGreaterThan4 Predicate 作为其参数。

使用该 Predicate 的过滤操作只允许长度大于 4 的字符串。与 Predicate 匹配的字符串最终被 collect 操作收集并存储到 List 中。

我们可以直接将 Predicate 传递给过滤函数,而不是单独创建 Predicate 对象。看下面的代码:

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

public class SimpleTesting {
  public static void main(String args[]) {
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(x -> x.length() > 4).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

输出:

[Karan, Aarya, Rahul, Pranav]

Java 中的 Predicate.and() 方法

我们可以使用 Predicate.and() 方法将两个 Predicate 应用于过滤操作。它返回一个复合 Predicate,该 Predicate 反映这个的逻辑并短路另一个 Predicate

如果在评估复合 Predicate 时此 Predicate,则不评估另一个 Predicate。该方法的方法签名是:

default Predicate<T> and(Predicate<? super T> other)

参数中的其他指的是我们可能想要应用的第二个 Predicate。现在让我们看一些例子来了解这种方法。看下面的代码:

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

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameGreaterThan3 = x -> x.length() > 3;
    Predicate<String> nameLesserThan5 = x -> x.length() < 5;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameGreaterThan3.and(nameLesserThan5)).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

输出:

[Alok]

在上面的代码中,第一个 Predicate 检查字符串长度是否大于 3,第二个 Predicate 检查字符串长度是否小于 5。当这两个 Predicate 都通过 AND 操作传递给过滤操作时,这过滤长度等于 4 的名称。

上面的代码可以更简洁地写成如下:

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

public class SimpleTesting {
  public static void main(String args[]) {
    // create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(x -> x.length() > 3 && x.length() < 5).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

输出:

[Alok]

Java 中的 Predicate.or() 方法

与前面的讨论一样,我们使用 and() 方法应用 AND 操作。我们还可以使用 or() 方法应用 OR 运算。

它返回一个复合 Predicate,该 Predicate 反映了这个和另一个短路的 Predicate 的逻辑。如果该 Predicate,则在评估复合 Predicate 时不考虑另一个 Predicate

该方法的方法签名是:

default Predicate<T> or(Predicate<? super T> other)

参数中的其他指的是我们可能想要应用的第二个 Predicate。现在让我们看一些例子来了解这种方法。看下面的代码:

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

public class SimpleTesting {
  public static void main(String args[]) {
    // predicate
    Predicate<String> nameEqualTo3 = x -> x.length() == 3;
    Predicate<String> nameEqualTo2 = x -> x.length() == 2;
    // Create a list
    List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> name_filtered =
        name.stream().filter(nameEqualTo3.or(nameEqualTo2)).collect(Collectors.toList());
    // print the resulting list
    System.out.println(name_filtered);
  }
}

输出:

[Ram, Om]

在上面的代码中,第一个 Predicate 检查字符串长度是否等于 3,第二个 Predicate 检查字符串长度是否等于 5。当这两个 Predicate 都通过 OR 操作传递给过滤器操作时,这过滤长度等于 3 或 2 的名称。

上面的代码可以更简洁地写成如下:

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

public class SimpleTesting {
  public static void main(String args[]) {
    // Create a list
    List<String> je_name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
    // create a stream
    // apply filter operation
    // pass the predicate
    List<String> je_name_filtered = je_name.stream()
                                        .filter(x -> x.length() == 3 || x.length() == 2)
                                        .collect(Collectors.toList());
    // print the resulting list
    System.out.println(je_name_filtered);
  }
}

输出:

[Ram, Om]

相关文章 - Java Interface