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>
T
是 Predicate
接口的输入类型。让我们举个例子来说明 Predicate
是什么。在数学世界中,Predicate
可以采用以下形式:
x -> x > 90
上面的语句表示,x
意味着 x
大于 90
。
让我们看一个如何创建 Predicate
对象的示例。
Predicate<Integer> noGreaterThan5 = x -> x > 5;
在上面的代码中,我们创建了一个名为 noGreaterThan5
的 Predicate
。该 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]