让我们看一下Java 8的Stream API如何改变了传统列表对象的比较方式。列表这种数据结构应用非常广泛,在开发软件的许多业务场景中,将列表中元素内容与某些特定条件进行比较是一个常见的用例。

这种比较大致有下面几种:

将列表中的每个元素与某个特定条件进行比较。例如,您有一个Employee对象列表,您需要检查所有员工是否都在18岁以上。

用一个列表中的一个或多个元素去匹配另一个列表的元素。

列表的所有元素是否都存在于另一个列表中。

现在,在java7中利用相对少的代码行来非常容易地写出这些使用实例。下面是一个示例,我们正在比较Java 7中的两个列表,并检查列表1中的任何元素是否存在于列表2中。

java 比较两个 list 比较两个list中的对象_API

 示例代码

现在我们看看Java 8中如何开发上面的用例。Java 8 Stream API提供了三种方法:allMatch、anyMatch和noneMatch,它们可以应用于与给定谓词匹配的Stream流对象(可以从各种数据源(尤其是集合)创建流),然后返回一个布尔值。

什么是流的上下文中(Stream Context)的“匹配”?

给定一个对象流,我们需要检查给定流中的对象是否匹配某些特定的标准。与上面我们写的遍历流元素和检查每个对象是否匹配标准的逻辑不同,Java 8 Stream允许对流中的对象进行声明式匹配。

我们需要将一个谓词实例定义为对照逻辑并将谓词作为匹配方法的输入。然后,Java 8会在Stream的内部处理匹配函数,并向您提供是否找到了匹配条件的结果。

Stream.allMatch:我们将谓词作为参数传递给allMatch()方法。该谓词应用于流的每个元素,如果每个元素都满足给定的谓词,那么它将返回true—否则为false。

Stream.anyMatch:对于anyMatch()方法,我们将谓词作为参数传递。对该谓词迭代流的元素。如果任何元素匹配,则返回true -否则为false。

Stream.noneMatch: noneMatch()方法是一个以参数作为谓词的方法,如果流的任何元素都不匹配给定的谓词,那么它就返回true—否则为false。

现在让我们来看看这些方法的一些例子。我们将有一个简单的模型类Employee,用于我们所有的示例:

java 比较两个 list 比较两个list中的对象_API_02

现在我们将定义一些谓词检查条件,用于这些方法。

java 比较两个 list 比较两个list中的对象_API_03

现在看一下下面的测试情况:

java 比较两个 list 比较两个list中的对象_Java_04

java 比较两个 list 比较两个list中的对象_API_05

因此,可以在EmployeePredicates类中定义谓词,也可以在这些方法中定义谓词,就像我们在noneMatch()方法中所做的那样。也可以用这样的方式 e-> e.getName().contains("Andy")。输出为:

java 比较两个 list 比较两个list中的对象_Java_06

我们可以收集与某个集合匹配的所有元素:

java 比较两个 list 比较两个list中的对象_用例_07

让我们收集并打印出所有收入超过300的员工的名字:

java 比较两个 list 比较两个list中的对象_API_08

用上面写的这些新的API比较两个列表?

现在让我们用Java 8提供的API重写最开始的代码:

java 比较两个 list 比较两个list中的对象_java 比较两个 list_09

最后的输出是这样:

java 比较两个 list 比较两个list中的对象_java 比较两个 list_10