【Java函数篇】Java 8 Predicate函数接口的用法详解
为什么介绍Predicate
自从Java8发布以后,代码里面就多了很多函数式的接口和代码。在流式的编程中,我们经常会用到Predicate和其他函数,在一些开源的代码中也会看到别人定义的Predicate方法。但其实你有没有感觉在写代码的经历中,就很少会定义Predicate方法,都是用在stream流中更多,比如下面这段代码。今天就来学习和分享一下Predicate,彻底了解和掌握Predicate的概念以及用法。

作为参考,在数学中谓词也通常被理解为布尔值函数“P:X?{true,false}”,成为X的谓词:
// Returns true if number is even; else false.
Predicate<Integer> evenPredicate = n -> n % 2 == 0; // Returns true if age is greater than or equals to 18; else false.
Predicate<Person> canVote = p -> p.age() >= 18; //Stream filtering with Predicate
List<Person> voters = personList.stream().filter(canVote).toList();
Predicate函数接口概念
我们先看下Java对Predicate的定义:
表示Predicate是一个接受一个<泛型>参数的布尔函数,返回的是true 或 false,经常被用于数据的过滤:
比如stream.filter(k -> k > 0)

示例
场景就是过滤一个list,经常会这样写:
@Testpublic void predicate() {List<People> peopleList = mockPeopleList();peopleList.stream().filter(people -> people.getAge() > 10).forEach(System.out::println);}
其中filter里这个lambda表达是就是个Predicate:
.filter(people -> people.getAge() > 10)
我们换一种写法如下:
@Testpublic void predicate() {List<People> peopleList = mockPeopleList();Predicate<People> predicate = people -> people.getAge() > 10;peopleList.stream().filter(predicate).forEach(System.out::println);}
这样比较清晰可以看到Predicate的使用方式。
什么时候使用Predicate
其实换种问法就是:在日常编程中,我们可以在哪里使用这些返回 true 或 false 的函数呢?
我们可以使用谓词在对集合中的对象进行条件评估后从集合中筛选对象,评估结果可以是 true 或 false。
例如,我们可以在以下实际用例中使用谓词:
- 找到特定日期之后出生的所有孩子
- 特定时间范围内订购的披萨
- 年龄大于特定岁数的员工
- 等等……
Predicate用法
1. 简单的Predicate
如前所述,谓词会评估表达式并返回布尔值。现在让我们通过一个简单的示例来看一下创建简单谓词的几个示例。
Predicate<Employee> isAdult = e -> e.getAge() > 18;
Predicate<Employee> isMale = p -> p.getGender().equalsIgnoreCase("M");
2. 复杂的Predicate
我们可以通过混合两个或多个谓词来创建一个复杂的谓词。可以使用and,or,negate等组合
Predicate<Employee> isAdultMale= isAdult.and(isMale);
Predicate<Employee> isAdultOrMale = isAdult.or(isMale);
或者这样:
@Testpublic void predicate() {List<People> peopleList = mockPeopleList();Predicate<People> ageGrate10 = people -> people.getAge() > 18;Predicate<People> genderMen = people -> people.getSex().equals("男");Predicate<People> levelLess5 = people -> people.getLevel() < 5;peopleList.stream().filter(ageGrate10.and(genderMen).or(levelLess5)).forEach(System.out::println);}
3. 反向谓词
可以使用 negate() 方法创建现有谓词的反向谓词。
Predicate<Employee> isMinor = isAdult.negate();
4. 在Java 8 Stream中使用Predicate
Predicate 是一个函数式接口,可以在需要谓词的任何地方将其传递到 lambda 表达式中。例如,Stream 接口中的 filter() 方法就是这样一种方法。
/*** Returns a stream consisting of the elements of this stream that match the given predicate.*/
Stream<T> filter(Predicate<? super T> predicate);
示例:
Predicate<Employee> isMale = p -> p.getGender().equalsIgnoreCase("M");
List<Employee> maleEmployeeList = employeeList.stream().filter(isMale).toList();
如果我们想使用两个参数来测试一个条件,我们也可以使用 BiPredicate 类。
BiPredicate<Integer, String> isAdultMale = (p1, p2) -> p1 > 18 && p2.equalsIgnoreCase("M");
List<Employee> adultMalesList = employeeList.stream().filter(x -> isAdultMale.test(x.getAge(), x.getGender())).toList();
总结
Predicate 提供了一种定义和使用布尔值条件作为对象的方法,从而使代码更加灵活和富有表现力。
相关文章:
【Java函数篇】Java 8 Predicate函数接口的用法详解
为什么介绍Predicate 自从Java8发布以后,代码里面就多了很多函数式的接口和代码。在流式的编程中,我们经常会用到Predicate和其他函数,在一些开源的代码中也会看到别人定义的Predicate方法。但其实你有没有感觉在写代码的经历中,…...
C++ 一个反射的例子
在 C 中实现反射机制,虽然不像其他高级语言那样直接,但可以通过宏、模板和注册系统等技术来实现一个简易的反射系统。下面是一个完整的 C 反射机制示例,通过自定义类注册系统和宏定义,实现类的名称、属性、方法的反射 。 #includ…...
vue3 解决背景图与窗口留有间隙的问题
需要实现一个登录界面,login.vue的代码如下: <script> import { ref } from vue;export default {setup() {return {};}, }; </script><template><div id"login-container" class"login-container"><di…...
Cesium for UE-04-一些说明
目前主要做webgis的工作,UE官方对web的支持截止到了4.23版本,即使是4.23版本之后的4.xx版本也有办法支持,已经有大佬开源了一些方法和工具,不再介绍。即使是4.23想要输出为h5,也是有一定的折腾门槛的。最重要的是【Ces…...
AIGC:开启智能创造的璀璨新篇章
在当今科技迅猛发展的时代浪潮中,人工智能( Artificial Intelligence , AI )已然历经了从早期的计算智能、感知智能逐步迈向认知智能的辉煌历程。而在这一进程中, AI 生成内容( Artificial Intelligence Generated Con…...
计算机组成原理与系统结构——外部存储器
笔记内容及图片整理自XJTUSE “计算机组成原理与系统结构” 课程ppt,仅供学习交流使用,谢谢。 磁盘 磁盘是一个由非磁性材料构成的圆形盘片(称为基片),上面涂抹可磁化材料。传统的基片一直是铝制或铝合金的࿰…...
如何使用 Browserless 抓取动态网站?
什么是动态网页? 动态网页是指其内容并非完全直接嵌入在静态HTML中,而是通过服务器端或客户端渲染生成的网页。 它可以根据用户的操作实时显示数据,例如在用户点击按钮或向下滚动页面时加载更多内容(如无限滚动)。这…...
第21~22周Java主流框架入门-Spring 2.SpringAOP面向切面编程
1.Spring AOP (Aspect-Oriented Programming) 1. 1. 什么是 Spring AOP? AOP(面向切面编程) 是 Spring 提供的一种可插拔的组件技术,允许我们在软件运行过程中添加额外的功能。场景:假设有两个模块,用户管…...
Flutter不常用组件----InteractiveViewer
在现代移动应用开发中,用户互动性是提升体验的关键。Flutter 提供了多种组件来帮助开发者实现丰富的交互功能,其中一个强大的组件便是 InteractiveViewer。它允许用户通过手势对内容进行缩放、平移和旋转,适用于需要用户查看大图、地图或者其…...
【LeetCode HOT 100】详细题解之二分查找篇
【LeetCode HOT 100】详细题解之二分查找篇 35 搜索插入位置思路代码(左闭右闭)代码(左闭右开) 74 搜索二维矩阵思路代码(左闭右闭) 34 在排序数组中查找元素的第一个和最后一个位置思路代码 33 搜索旋转排序数组思路代码 153 寻找旋转排序数组中的最小值思路代码 4 寻找两个正…...
管理篇(顶级思维模型(31个))(待做)
目录 一、成长进阶模型 二、优势探索模型 三、优势层次模型 四、人生定位模型 五、看懂人性模型 六、如何抉择模型 七、本质思考模型 八、心流模型 九、精力管理模型 十、高效沟通模型 十一、100%传递模型 十二、高效倾听模型 十三、高效表达模型 十四、精准提问模…...
十一、数据库配置
一、Navicat配置 这个软件需要破解 密码是:123456; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句,会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…...
day02 -- docker
1.docker的介绍 Docker 是一个开源的应用容器引擎,基于 Go语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使…...
ecmascript标准
1. 简介 1.1. 概述 ECMAScript(简称ES)是JavaScript编程语言的一个标准化版本。它是为网络开发设计的一种轻量级的脚本语言,主要用于在网页上实现交互性和动态效果。ECMAScript是该语言的标准名称,而JavaScript是其最知名和广泛使用的实现。 1.2. 特点 跨平台性 :ECMAS…...
在Linux命令行中一行执行多个命令
原文地址链接: https://kashima19960.github.io/2024/10/22/Linux/在Linux命令行中一行执行多个命令/,一般有最新的修改都是在我的个人博客里面,所以在当前平台的更新会比较慢,请见谅😃 前言 在shell中一个一个命令行,…...
u盘快速格式化后怎么恢复文件:深入解析与全面指南
U盘,凭借其小巧便携、易于使用的特点,成为了我们日常生活中不可或缺的数据存储工具。然而,有时为了清除病毒、解决文件系统错误或准备存储新数据,我们可能需要对U盘进行快速格式化。但这一操作往往伴随着一个严峻的问题࿱…...
青少年编程能力等级测评CPA C++(二级)试卷(2)
青少年编程能力等级测评CPA C(二级)试卷(2) 一、单项选择题(共20题,每题3.5分,共70分) CP2_2_1.下列C程序段中,对二维数组arr的定义不正确是( &…...
aws 把vpc残留删除干净
最近忘了把vpc 删干净导致又被收了冤大头钱 在删除vpc 的收发现又eni在使用,但是忘了是哪个资源在占用 先用命令行把占用的资源找出来停掉 使用 AWS 命令行界面(CLI)来查看 VPC 的使用情况 列出子网: aws ec2 describe-subnets …...
平衡二叉树最全代码
#include<stdio.h> #include<stdlib.h>typedef struct Node {int val;int height;struct Node *left;struct Node *right; }Node;//创建新结点 Node* newNode(int val) {Node *node (Node*)malloc(sizeof(Node));node->val val;node->height 1;node->l…...
数据库表的创建
运用的环境是pychram python3.11.4 创建一个表需要用到以下语法 注释已经写清楚各种语法的含义,记住缩进是你程序运行的关键,因为程序是看你的缩进来判断你的运行逻辑,像我这个就是缩进不合理导致的报错 那么今天分享就到这里,谢…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
