Java 中的谓词

2023-11-29

我正在浏览使用的代码Predicate在爪哇。我从来没有用过Predicate。有人可以指导我任何教程或概念解释吗Predicate以及它在Java中的实现?


我假设你正在谈论com.google.common.base.Predicate<T>来自番石榴。

从API:

确定一个true or false给定输入的值。例如,一个RegexPredicate可能会实施Predicate<String>,并为任何与其给定正则表达式匹配的字符串返回 true。

这本质上是一个 OOP 抽象boolean test.

例如,您可能有这样的辅助方法:

static boolean isEven(int num) {
   return (num % 2) == 0; // simple
}

现在,给定一个List<Integer>,您只能像这样处理偶数:

    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    for (int number : numbers) {
        if (isEven(number)) {
            process(number);
        }
    }

With Predicate, the if测试被抽象为一种类型。这允许它与 API 的其余部分进行互操作,例如Iterables,其中有许多实用方法,需要Predicate.

因此,您现在可以编写如下内容:

    Predicate<Integer> isEven = new Predicate<Integer>() {
        @Override public boolean apply(Integer number) {
            return (number % 2) == 0;
        }               
    };
    Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven);

    for (int number : evenNumbers) {
        process(number);
    }

请注意,现在 for-each 循环更加简单,没有if测试。我们通过定义达到了更高的抽象级别Iterable<Integer> evenNumbers, by filter-使用aPredicate.

API链接

  • Iterables.filter
    • 返回满足谓词的元素。

关于高阶函数

Predicate allows Iterables.filter充当所谓的高阶函数。就其本身而言,这提供了许多优点。采取List<Integer> numbers上面的例子。假设我们想测试所有数字是否都是正数。我们可以这样写:

static boolean isAllPositive(Iterable<Integer> numbers) {
    for (Integer number : numbers) {
        if (number < 0) {
            return false;
        }
    }
    return true;
}

//...
if (isAllPositive(numbers)) {
    System.out.println("Yep!");
}

With a Predicate,并与其余库进行互操作,我们可以这样写:

Predicate<Integer> isPositive = new Predicate<Integer>() {
    @Override public boolean apply(Integer number) {
        return number > 0;
    }       
};

//...
if (Iterables.all(numbers, isPositive)) {
    System.out.println("Yep!");
}

希望您现在可以看到例程的更高抽象的价值,例如“通过给定谓词过滤所有元素”、“检查所有元素是否满足给定谓词”等,从而获得更好的代码。

不幸的是,Java 没有一流的方法:你不能通过methods大约到Iterables.filter and Iterables.all。当然你也可以绕过去objects在爪哇。就这样Predicate类型已定义,并且您通过objects而是实现这个接口。

See also

  • 维基百科/高阶函数
  • 维基百科/过滤器(高阶函数)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的谓词 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • 如何从Firebase Firestore实时更新文档中获取修改后的字段或数据? [复制]

    这个问题在这里已经有答案了 我有多个文档 我的问题是我无法获取修改的特定数据 我正在获取完整的文档 db collection employees whereEqualTo OID OID addSnapshotListener new E
  • 使用 JDBC 获取 Oracle 11g 的最后插入 ID

    我是使用 Oracle 的新手 所以我将放弃之前已经回答过的内容这个问题 https stackoverflow com questions 3131064 get id of last inserted record in oracle
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • ArrayList.clear() 和 ArrayList.removeAll() 有什么区别?

    假如说arraylist定义为ArrayList

随机推荐

  • Java的swing print()用法

    java的swing print 是否必须在EDT 事件调度线程 上调用 众所周知 执行需要花费很长的时间 而且在 EDT 上长时间运行的事情是很痛苦的 简短的回答是 不 打印不需要在 EDT 上进行 官方教程中对此进行了介绍 如何打印文本
  • 高质量完整屏幕截图 VB.Net

    我正在尝试向我的程序添加一项功能 以便在用户单击按钮时获取用户屏幕的完整屏幕截图 我让程序截取屏幕截图并打开文件对话框来保存它 保存有效 问题是 无论我如何保存屏幕截图 保存的图像都会出现显着的质量损失 并且文本和内容周围会出现像素化 这是
  • ajax调用后f:viewParam丢失

    我有这个 f viewParam 来设置值并在视图中的 back bean 中进行搜索
  • 如何在 Javascript 中将按钮点击率限制为每分钟一次

    我有一个基于 PHP 的 Web 应用程序 用于监视进程的状态并显示具有该状态的页面 用户可以单击页面上的按钮来更新状态 但是 我的服务器上的处理负载足够重 因此不希望过于频繁地更新状态 因此 我想要一种方法来限制某人每分钟点击 提交 按钮
  • 区域设置 en-EN 是无效的区域性标识符

    我最近从一台装有 Windows 10 和 VS 2017 的计算机转移到一台装有 Windows 8 1 和 VS 2017 的计算机 我正在处理一段代码 其中有这样一行 Thread CurrentThread CurrentUICul
  • 如果我使用 celery 作为任务调度程序,如何从 python 应用程序登录到 splunk?

    我有一个在服务器上运行的 python 脚本 该脚本应该由 celery 调度程序每天执行一次 我想将日志直接从脚本发送到 splunk 我正在尝试使用这个splunk handler图书馆 如果我在本地运行没有 celery 的 splu
  • iOS 上带有 UIWebView 的多选项卡 Web 浏览器

    我正在创建一个简单的网络浏览器 我希望我的用户添加选项卡并同时浏览多个网页 就像在 Safari Firefox 或 Chrome 中一样 我已经这样做了 效果很好 但我不知道是否有更简单的方法来做到这一点 当用户添加新选项卡时 我的应用程
  • 终端进程无法启动:shell 可执行文件的路径“C:\Windows\System32”不是符号链接的文件

    我真的不知道该怎么办 有人可以帮忙吗 这是在 vscode 上 这是因为它找不到 exe可执行文件 您可以使用以下设置修复它 如果你使用cmd exe要执行脚本 请使用 terminal integrated shell windows C
  • 如何在正则表达式中匹配“直到该字符序列的任何内容”?

    采用这个正则表达式 abc 这将匹配字符串开头的任何单个字符 除了a b or c 如果您添加一个 之后 abc 正则表达式将继续将每个后续字符添加到结果中 直到满足a or b or c 例如 使用源字符串 qwerty qwerty w
  • 在 dexguarding 时没有有效的 android:name

    我正在尝试对作为系统应用程序运行的应用程序进行 dexguard 但是当我尝试将其推到system app目录中 我从 PackageParser 中收到以下错误 W PackageParser 1995 system app My apk
  • 无法将 Boost.Thread 1.46.1 与 MinGW 4.5.2 链接

    我使用以下方法构建了 boost bjam toolset gcc with thread stage 每当我尝试实际使用 Boost Thread 时 尽管我链接了它 但我都会收到未定义的引用 其他 Boost 库 例如 Regex 或
  • 将字符串转换为日历。最简单的方法是什么? [复制]

    这个问题在这里已经有答案了 将格式化字符串转换为日历的最简单方法是什么 例如日历中的 dd MM yyyy DateFormat df new SimpleDateFormat dd MM yyyy Calendar cal Calenda
  • 将 ASP.NET 部署到 Windows Azure 云,应用程序在云上运行时出现错误

    我正在尝试在 Windows Azure 云中部署 ASP NET 应用程序 我正在使用 Google API 进行应用程序中的调用之一 当我这样做时 我收到以下错误 System UnauthorizedAccessException 对
  • CodeIgniter-单击每个链接或重新加载页面时检查会话变量是否已设置

    我有一个名为 admin 的控制器 如果设置了会话变量 则可以使用控制器中的所有功能 那么当单击页面中的每个链接或重新加载页面时 检查会话是否设置的最佳方法是什么 例如 如果我在多个选项卡中打开我的管理主页 浏览器并从第一个选项卡注销 然后
  • Python PPTX条形图负值

    我使用以下代码为 python pptx 生成的条形图指定条形的特定颜色 chart series 0 format fill solid chart series 0 format fill fore color rgb RGBColor
  • 使用 JOLT 转换重命名嵌套数组中的字段

    我想使用 JOLT 转换库重命名嵌套在另一个数组中的数组中的字段 要重命名的一个字段是数组中的顶级字段 要重命名的两个字段位于嵌套数组内 我尝试过使用通配符 但它们没有给我预期的输出 我使用的是 JOLT 0 0 22 版本 输入 JSON
  • 使用 QueryByAttribute 无法检索空值

    我是 CRM 开发新手 除了 CRM 2011 中的现有值之外 我还想从我的 C 应用程序更新自定义字段值 如果该字段有一些值 那么它工作正常 但如果它为空 那么我收到 给定的键不存在于字典中 错误 下面的代码是我想要实现的目标 IOrga
  • 如何使用 bash 删除并替换终端中的最后一行?

    我想在 bash 中实现一个显示经过秒数的进度条 为此 我需要擦除屏幕上显示的最后一行 命令 clear 会擦除所有屏幕 但我只需要擦除进度条的行并将其替换为新信息 最终结果应如下所示 Elapsed time 5 seconds 然后 1
  • 如何诊断 MS 访问崩溃

    我们有一个用 Access 编写的自定义程序 其中有奇怪的崩溃 我们添加了错误处理 记录并通过电子邮件发送我们自己的代码内部发生的任何崩溃 这使我们能够修复生成的大多数错误 但有时崩溃发生在我们的代码外部 我们发现 2013 年新出现的一个
  • Java 中的谓词

    我正在浏览使用的代码Predicate在爪哇 我从来没有用过Predicate 有人可以指导我任何教程或概念解释吗Predicate以及它在Java中的实现 我假设你正在谈论com google common base Predicate