Java基础学习之函数式编程Predicate接口(JDK8)

2023-11-13

前言

今天继续来学习函数式编程接口之Predicate接口。


1. 上源码

package javax.persistence.criteria;

import java.util.List;

public interface Predicate extends Expression<Boolean> {
    Predicate.BooleanOperator getOperator();

    boolean isNegated();

    List<Expression<Boolean>> getExpressions();

    Predicate not();

    public static enum BooleanOperator {
        AND,
        OR;

        private BooleanOperator() {
        }
    }
}

 哎?不对不对,不是这个

应该是这个

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T var1);

    default Predicate<T> and(Predicate<? super T> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return this.test(var2) && var1.test(var2);
        };
    }

    default Predicate<T> negate() {
        return (var1) -> {
            return !this.test(var1);
        };
    }

    default Predicate<T> or(Predicate<? super T> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return this.test(var2) || var1.test(var2);
        };
    }

    static <T> Predicate<T> isEqual(Object var0) {
        return null == var0 ? Objects::isNull : (var1) -> {
            return var0.equals(var1);
        };
    }
}

咳咳,第一段代码希望不要给大家带来困扰,第一段代码其实就是JPA在拼装sql语句时候用的表达式组装类。既然他们的名字一样,那其实他们代表的大致作用也是差不多的,接下来我们依据源代码来剖析一下这个接口。

2. 源码解读

首先是肯定是经典的一个接口只有一个抽象方法,然后接口上面加上

@FunctionalInterface

来做函数式接口的校验。

2.1  and

default Predicate<T> and(Predicate<? super T> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return this.test(var2) && var1.test(var2);
        };
    }

该方法返回的是一个Predicate用lambda表达式实例化的一个匿名内部类,我们重点关注一下这个匿名内部类中的返回

return this.test(var2) && var1.test(var2);

返回的是一个boolean值,这点很重要,predicate返回的就是一个boolean值,后面的所有的方法均是如此。

逻辑上是“&&”且的关系,两个条件同时满足返回true,否则返回false。

举个例子:

1. 判断该参数是否为偶数

2. 判断改参数是否大于10

import java.util.function.Predicate;

public class StringBuilderTest {
    public static void main(String[] args) {
        //判断是否为偶数
        Predicate<Integer> predicate1 = integer -> (integer & 1) == 0;
        //判断是否大于10
        Predicate<Integer> predicate2 = integer -> integer > 10;

        System.out.println(predicate1.and(predicate2).test(12));
        System.out.println(predicate1.and(predicate2).test(11));
        System.out.println(predicate1.and(predicate2).test(10));
    }
}
true
false
false

这样既不用使用很多的ifelse来做判断,而且这些判断条件可以复用,在逻辑上会更加顺畅。

2.2 negate

default Predicate<T> negate() {
        return (var1) -> {
            return !this.test(var1);
        };
    }

我们还是直接看返回,返回的是该判断条件的逻辑取反。

2.3 or

default Predicate<T> or(Predicate<? super T> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return this.test(var2) || var1.test(var2);
        };
    }

返回的是两个判断条件的逻辑取或,只要两个条件有一个为true,即为true,否则为false

2.4 isEqual

 static <T> Predicate<T> isEqual(Object var0) {
        return null == var0 ? Objects::isNull : (var1) -> {
            return var0.equals(var1);
        };
    }

注意一下,这个方法跟前面的三个是不一样的,这是一个静态方法

(1)这个方法的入参是object 而不是Predicate

(2)这个方法返回的是Predicate,所以他存在的意义其实是在Predicate链式编程的时候传入一个判断条件

(3)注意这个返回的空判断方法和这个三目运算的逻辑

所以在需要做很多判断的时候可以用Predicate接口来执行判断,可以用“且或非”三种逻辑进行灵活组合。

作为函数式编程的第二个接口,特点就是“有入参,返回boolean”。

下一章我们继续学习Function接口

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

Java基础学习之函数式编程Predicate接口(JDK8) 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 未捕获 Func<> 的异常(异步)

    我有以下代码 为了进行此重现而进行了简化 显然 catch 异常块将包含更多逻辑 我有以下代码 void Main var result ExecuteAction async gt Will contain real async code
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https

随机推荐

  • 使用rancher在k8s上完成第一个CI/CD的项目_.NET篇

    隔了几天没写了 一是忙的不行 二是遇到一个问题一直没解决 我们自己搭建的harbor仓库是没有域名的 也没做nginx转发 所以都是http请求的 构建项目时会在两个地方遇到关于docker访问http仓库不通的问题 第一个 构建成功pus
  • Hadoop集群——shell自动采集文件到HDFS

    1 配置环境变量 在 export data logs目录下 目录不存在 则先提前创建该目录 使用vi命令创建 upload2HDFS sh脚本文件 在编写Shell脚本时 需要设置Java环境变量 即使当前虚拟 机节点已经配置了Java环
  • windows10下navicat 无限使用小技巧

    windows10下navicat 无限次使用小技巧 1 首先win R 输入regedit 2 找到HKEY CURRENT USER gt Software gt Classes gt CLSID gt 下面文件夹中有info的删除掉
  • 如何从巨潮资讯爬取股票公告

    z如何做一个难以被反制的爬虫 Selenium Python爬取新股材料实例 之前我写了上面这篇文章来说明如何从深交所或者上交所的网站爬取文件 但是这个爬虫是有点不稳定的 因为网速的原因 偶然间我发现巨潮资讯已经整合了所需要的公告 因此又写
  • tomcat常见报错

    1 Web页面乱码 解决方案 1 可以采用英文输出 只需要配置启动参数即可 2 确认项目编码都设置为UTF 8后 在StringManager java 134行后 增加一行代码 str new String str getBytes St
  • PAT 乙级 1057 数零壹 python

    题目 思路 先判断是否为字母 再求和 通过迭代取余 计算0 1的数目 代码 alpha a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17
  • 蓝桥杯题库 历届试题部分(C++、Java)代码实现(16-30)

    文章目录 五 历届试题 PREV 16 农场阳光 PREV 17 约数倍数选卡片 PREV 18 车轮轴迹 PREV 19 九宫重排 PREV 20 公式求值 PREV 21 回文数字 PREV 22 国王的烦恼 PREV 23 数字游戏
  • flutter toast插件 OKToast的介绍

    OKToast 是一款 在 flutter 上 使用的 toast 插件 使用简单 可定制性强 纯 flutter 调用不用 context 文章目录 安装 使用 在代码中定义 OKToast 组件 调用 文本 toast 自定义 widg
  • Centos7安装redis(详细步骤)

    一 安装redis 1 yum安装redis yum install redis 2 启动redis 启动redis service redis start 停止redis service redis stop 查看redis运行状态 se
  • c++栈详解(附代码)

    1 栈 Stack 是一种线性存储结构 它具有如下特点 1 栈中的数据元素遵守 先进后出 First In Last Out 的原则 简称FILO结构 后进先出的叫法 也是可以的 2 限定只能在栈顶进行插入和删除操作 2 栈的相关概念 1
  • CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解

    feature map 卷积核 卷积核个数 filter channel的概念解释 feather map的理解 在cnn的每个卷积层 数据都是以三维形式存在的 你可以把它看成许多个二维图片叠在一起 像豆腐皮一样 其中每一个称为一个feat
  • 使用WTGAHRS2(JY-GPSIMU)在ROS中读取数据并发布话题

    目录 IMU简介 驱动程序 IMU串口通信协议 程序 效果 IMU简介 十轴惯性导航传感器WTGAHRS2传感器集成高精度的陀螺仪 加速度计 地磁场传感器 GPS 模块 采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法 能够快速求
  • nodejs性能优化——多进程

    1 引言 现在在准备毕设 打算还是使用nodejs作为后端 遇到了一些知识上的瓶颈 主要是想要写出一个高性能点的爬虫 由于每次请求的http数量上万 经常挂了 要么是他人的服务器终止了连接 要么是node经不起密集CPU 毕竟请求完成之后还
  • MySQL(DDL)

    1 了解主流的数据库和数据库分类 1 1数据库概念 数据库 按照数据结构来组织 存储和管理数据的一种建立在计算机存储设备上的仓库 数据库的优势 1 可以持久化存储大量的数据 方便我们进行检索 2 可以保证数据的安全和数据的一致性 事物 3
  • printk的使用

    参考文章 https blog csdn net wwwlyj123321 article details 88422640 https blog csdn net m0 46170433 article details 105263694
  • FTP-----局域网内部远程桌面

    此文包含详细的图文教程 有疑问评论区留言 博主第一时间解决 目录 一 被远程桌面的电脑 1 开启远程权限 2 添加账户 有本地账户跳过这步 3 帐号隶属于 远程桌面 4 帐号隶属于 本地用户组 二 本地电脑连接远程桌面 前提条件 1 两台电
  • buffer_head数据结构

    内核版本 5 9 0 数据结构 Historically a buffer head was used to map a single block within a page and of course as the unit of I O
  • Spring boot new对象,通过上下文实例化对象

    import org springframework beans BeansException import org springframework beans factory NoSuchBeanDefinitionException i
  • 类的设计与实现 设计一个游戏的某个简单过程

    大作业1 类的设计与实现 一 实验目的 掌握类的设计与实现 了解如何根据描述发现类及其成员 具备初步的面向对象分析与设计能力 二 实验内容 请选择一个你所熟悉的游戏 分析其中的某个场景所涉及的类 及其各个类的属性和行为 完成类的定义 请选择
  • Java基础学习之函数式编程Predicate接口(JDK8)

    前言 今天继续来学习函数式编程接口之Predicate接口 1 上源码 package javax persistence criteria import java util List public interface Predicate