迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 中的 Predicate 是什么

作者:迹忆客 最近更新:2023/10/19 浏览次数:

本教程通过 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]

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 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 中,流是对象的集合。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便