运维开发网

java基础理论流的过滤和谓词逻辑

运维开发网 https://www.qedev.com 2022-09-16 15:35 出处:网络
这篇文章主要为大家介绍了java基础理论Stream的Filter与谓词逻辑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

这篇文章主要为大家介绍了java基础理论Stream的Filter与谓词逻辑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


一、基础代码准备

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

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

编写一个测试类。这个测试类的内容也很简单。创建十个新的雇员对象。

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"); Listlt;Employeegt; employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); Listlt;Employeegt; filtered = employees.stream() .filter(e -gt; e.getAge() gt; 70 amp;amp; e.getGender().equals("M")) .collect(Collectors.toList()); System.out.println(filtered); }}

需要注意的是,上面的过滤器在lambda expression中传递(我们在上一章已经讲过了),它过滤的是年龄大于70岁、男性的Employee。输出如下所示:

[Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)]二、什么是谓词逻辑?

下面说说我们的重点。通过前面几章的解释,我们已经知道lambda expression表达了一个匿名接口函数的实现。特定于Stream.filter()的。它表达了什么?看下图:可以看出它表达了一个谓词接口。在英语中,这个词的意思是:谓语。


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


什么是谓词逻辑?

WHERE和AND定义了主体employee是什么,那么WHERE和AND语句所表示的逻辑就是谓词逻辑。

SELECT *FROM employeeWHERE age gt; 70AND gender = 'M'三、谓词逻辑的复用

通常,过滤函数中的lambda表达式是一次性谓词逻辑。如果我们的谓词逻辑需要在多个地方、多个场景、多个代码中使用,通常会被提取出来,单独定义到它所定义的主体实体中。例如,在Employee实体类中定义以下谓词逻辑。

public static Predicatelt;Employeegt; ageGreaterThan70 = x -gt; x.getAge() gt;70; public static Predicatelt;Employeegt; genderM = x -gt; x.getGender().equals("M");3.1.and语法(并集)Listlt;Employeegt; 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语法(交集)Listlt;Employeegt; filtered = employees.stream() .filter(Employee.ageGreaterThan70.or(Employee.genderM)) .collect(Collectors.toList());

输出如下:其实都是70岁以上的男性(由于79岁也是男性,所以都是男性)。

[雇员(id=1,年龄=23,性别=M,名字=Rick,姓氏= Beethovan),雇员(id=3,年龄=43,性别=M,名字=Ricky,姓氏=Martin),雇员(id=4,年龄=26,性别=M,名字=Jon,姓氏=Lowman),雇员(id=6,年龄=15,性别=M,名字=David,姓氏=Feezor),雇员(id=8,年龄=79,性别=M,名字=Alex,名字= fee

3.3.negate语法(取反)Listlt;Employeegt; filtered = employees.stream() .filter(Employee.ageGreaterThan70.or(Employee.genderM).negate()) .collect(Collectors.toList());

输出如下:把上一段代码的结果反过来,其实都是女人。

[雇员(id=2,年龄=13,性别=F,名字=Martina,姓氏=Hengis),雇员(id=5,年龄=19,性别=F,名字=Cristine,姓氏=Maria),雇员(id=7,年龄=68,性别=F,名字=Melissa,姓氏=Roy),雇员(id=9,年龄=15,性别=F,名字=Neetu,姓氏=Singh)]

以上是java基础理论流的过滤器和谓词逻辑的细节。更多关于java流的过滤器和谓词逻辑的信息

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号