一、基础代码准备

建立一个实体类,该实体类有五个属性。下面的代码使用了lombok的注解Data、AllArgsConstructor,这样我们就不用写get、set方法和全参构造函数了。lombok会帮助我们在编译期生成这些模式化的代码。

@Data@AllArgsConstructorpublic class Employee {   private Integer id;   private Integer age;   //年龄   private String gender;  //性别   private String firstName;     private String lastName;}

写一个测试类,这个测试类的内容也很简单,新建十个Employee 对象

public class StreamFilterPredicate {    public static void main(String[] args){        Employee e1 = new Employee(1,23,"M","Rick","Beethovan");        Employee e2 = new Employee(2,13,"F","Martina","Hengis");        Employee e3 = new Employee(3,43,"M","Ricky","Martin");        Employee e4 = new Employee(4,26,"M","Jon","Lowman");        Employee e5 = new Employee(5,19,"F","Cristine","Maria");        Employee e6 = new Employee(6,15,"M","David","Feezor");        Employee e7 = new Employee(7,68,"F","Melissa","Roy");        Employee e8 = new Employee(8,79,"M","Alex","Gussin");        Employee e9 = new Employee(9,15,"F","Neetu","Singh");        Employee e10 = new Employee(10,45,"M","Naveen","Jain");        List employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);        List filtered = employees.stream()                .filter(e -> e.getAge() > 70 && e.getGender().equals("M"))                .collect(Collectors.toList());        System.out.println(filtered);    }}

需要注意的是上面的filter传入了lambda表达式(之前的章节我们已经讲过了),表达过滤年龄大于70并且男性的Employee员工。输出如下:

[Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)]

二、什么是谓词逻辑?

下面要说我们的重点了,通过之前的章节的讲解,我们已经知道lambda表达式表达的是一个匿名接口函数的实现。那具体到Stream.filter()中,它表达的是什么呢?看下图:可以看出它表达的是一个Predicate接口,在英语中这个单词的意思是:谓词。

什么是谓词?(百度百科)

什么是谓词逻辑?

WHERE 和 AND 限定了主语employee是什么,那么WHERE和AND语句所代表的逻辑就是谓词逻辑

SELECT *FROM employeeWHERE age > 70AND gender = 'M'

三、谓词逻辑的复用

通常情况下,filter函数中lambda表达式为一次性使用的谓词逻辑。如果我们的谓词逻辑需要被多处、多场景、多代码中使用,通常将它抽取出来单独定义到它所限定的主语实体中。 比如:将下面的谓词逻辑定义在Employee实体class中。

   public static Predicate ageGreaterThan70 = x -> x.getAge() >70;   public static Predicate genderM = x -> x.getGender().equals("M");

3.1.and语法(并集)

List filtered = employees.stream()        .filter(Employee.ageGreaterThan70.and(Employee.genderM))        .collect(Collectors.toList());

输出如下:

[Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)]

3.2.or语法(交集)

List filtered = employees.stream()        .filter(Employee.ageGreaterThan70.or(Employee.genderM))        .collect(Collectors.toList());

输出如下:实际上就是年龄大于70的和所有的男性(由于79的那位也是男性,所以就是所有的男性)

[Employee(id=1, age=23, gender=M, firstName=Rick, lastName=Beethovan), Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin), Employee(id=4, age=26, gender=M, firstName=Jon, lastName=Lowman), Employee(id=6, age=15, gender=M, firstName=David, lastName=Feezor), Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin), Employee(id=10, age=45, gender=M, firstName=Naveen, lastName=Jain)]

3.3.negate语法(取反)

List filtered = employees.stream()        .filter(Employee.ageGreaterThan70.or(Employee.genderM).negate())        .collect(Collectors.toList());

输出如下:把上一小节代码的结果取反,实际上就是所有的女性

[Employee(id=2, age=13, gender=F, firstName=Martina, lastName=Hengis), Employee(id=5, age=19, gender=F,

面试资料可私聊,Java,资料,面试

java stream 多个filter_恕我直言你可能真的不会java第3篇:Stream的Filter与谓词逻辑...相关推荐

  1. java 正则 cpu 100_这六个原因真的可以使Java应用程序的CPU使用率飙升到100%吗?...

    点击上方的"代码农户的冥想记录",然后选择"设为明星" 高质量文章,及时交付 问题 1. 无限while循环会导致CPU使用率飙升吗? 2.经常使用Young ...

  2. java获取当月有几天_你真的能在JAVA开发这条路上面一直坚持下去吗?

    JAVA为什么有前途? 过去的十多年,JAVA基本每年都是全世界使用人数第一的语言.全世界数百万的IT企业构建了庞大的JAVA生态圈,大量的软件基于JAVA开发. JAVA也被誉为"计算机界 ...

  3. java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作

    一.回顾Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Mon ...

  4. java stream findlast_恕我直言你可能真的不会java第9篇-Stream元素的匹配与查找

    在我们对数组或者集合类进行操作的时候,经常会遇到这样的需求,比如: 是否包含某一个"匹配规则"的元素 是否所有的元素都符合某一个"匹配规则" 是否所有元素都不符 ...

  5. java lambda表达式_恕我直言你可能真的不会java第1篇:lambda表达式会用了么?

    本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...

  6. java 与sql设置排序方法是_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合...

    在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee { private Inte ...

  7. list按照某个字段排序_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合

    在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee {private Integ ...

  8. ricky java_恕我直言你可能真的不会java第8篇-函数式接口

    一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...

  9. java8 stream 做累加_《Java 8 in Action》Chapter 1:为什么要关心Java 8

    自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生.项目经理和程序员等一大批活跃用户的欢迎.这一语言极富活力,不断被用在大大小小的项目里.从 Java 1.1(199 ...

最新文章

  1. MySQL数据库中的内置函数
  2. 计算机视觉不可能凉!
  3. 清除window 系统中的垃圾文件-转
  4. 在linux查看内存的大小
  5. 速学c++(1)-c++简介
  6. PHP 9 大缓存技术总结
  7. 数据库主键设计之思考(转)
  8. 今天,Python信息量很大!
  9. SpringBoot指南(五)——拦截器、原生组件
  10. 解析php变量,php使用parse_str实现查询字符串解析到变量中的方法
  11. Docker实践 -- 安装Docker
  12. 深入理解ButterKnife源码并掌握原理(四)
  13. amd一键超频怎么用_(完整版)超频必看AMD_CPU超频教程
  14. 2022-2027年中国酒店及酒店管理市场竞争态势及行业投资前景预测报告
  15. homeassistant core安装方式无HACS插件成功解决(记录)
  16. python读取.data文件总结
  17. YOLO—V1细节分析
  18. 解决MacOS系统升级时显示安装所选更新时发生错误的问题
  19. 关于linux磁盘爆满定位大文件的方法
  20. R计算 地理集中指数

热门文章

  1. Dubbo管控台Windows安装
  2. c语言随机产生arp报文,c语言构造arp报文
  3. 【Maven】maven 插件开发实战
  4. chrome 插件精选之 github 篇
  5. 帧布局(FrameLayout)及属性
  6. 01 ORA系列:ORA-00904 标识符无效 invalid identifier
  7. 操作系统之银行家算法—详解流程及案例数据
  8. Oracle中的序列 sequence 用法
  9. 7 php程序的调试方法_PHP程序错误调试方法 让php显示错误提示
  10. lstm 根据前文预测词_干货 | Pytorch实现基于LSTM的单词检测器