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) 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • 使用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