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]
相关文章
在 Java 中扩展 Comparable
发布时间:2023/10/19 浏览次数:96 分类:Java
-
本教程展示了如何在 Java 中清除 StringBuilder 本指南将了解在 Java 中扩展 Comparable 接口。它写成 Comparable
。它是一个由 Java 中的许多类实现的接口。
Java Swing 应用程序的最佳 GUI 构建器
发布时间:2023/10/19 浏览次数:164 分类:Java
-
我们将对可用于 Java Swing 应用程序开发的最流行的图形用户界面(GUI) 构建器进行分类。一个优秀的图形用户界面集成了诸如自定义控制、设计代码的拆分查看和易于使用的界面等功能,并且应该
Java 中的动态方法调度
发布时间:2023/10/18 浏览次数:199 分类:Java
-
本教程展示了 Java 中动态方法分派的定义、优势和使用。本教程介绍了 Java 中的动态方法分派。它讲述了它的技术定义和重要性,并用代码示例进行了解释。
Java 中的 abs() 方法
发布时间:2023/10/18 浏览次数:184 分类:Java
-
本教程通过 Java 中的不同代码示例介绍如何使用 abs() 方法。我们将学习 Java 中的 abs() 方法来查找指定数字的绝对值。我们将通过编写和练习各种代码示例来学习。
在 Java 中使用 System.exit() 方法
发布时间:2023/10/18 浏览次数:158 分类:Java
-
本文介绍 Java 中 System.exit() 方法的作用。本教程介绍了 Java 中的 System.exit() 方法的作用。System 是 Java 中的一个类,它提供了几种实用方法来处理与系统相关的任务,例如 exit() 方法用于停止当前
在 Java 中编写本机方法
发布时间:2023/10/18 浏览次数:57 分类:Java
-
本文演示了本机方法是什么以及如何在 Java 程序中编写本机方法。本文将引导你完成学习如何在 Java 程序中编写本机方法所需的各个步骤。
Java 中静态方法和非静态方法的区别
发布时间:2023/10/18 浏览次数:134 分类:Java
-
本教程对 Java 中的静态和非静态方法进行了分类,同时区分了它们的核心属性和范围。之后,我们将对这两种方法运行三个示例。
Java 中的私有方法
发布时间:2023/10/18 浏览次数:51 分类:Java
-
本教程演示了 Java 中私有方法的使用。Java 中的私有方法有一个私有访问修饰符,这意味着它们对定义类的访问受到限制,并且在继承的子类中不可访问;这就是为什么他们没有资格覆盖。
Java 中的流过滤器
发布时间:2023/10/18 浏览次数:130 分类:Java
-
本文介绍 Java 中的流 API 及其过滤方法。本教程介绍 Java 中的流 API 及其 filter() 方法。在 Java 中,流是对象的集合。