如何比较一个List对象Java 7 vs Java 8

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

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

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

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

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

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

示例代码

现在我们看看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,用于我们所有的示例:

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

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

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

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

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

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

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

最后的输出是这样:

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android研究院

深入理解链表和手写链表以及面试中常问链表的问题

上一期 讲到了 顺序表与链表的基本知识 了解链表的基本知识。并且分析了ArrayList的源码。顺序表(随机访问速度快,插入和删除效率低)和链表(随机访问速度慢...

1.5K2
来自专栏java学习

重要通知!小编出新的Java练习题咯!!

正确答案 3月5号公布 一、选择题和问答题 1、在一个java原文件中,import, class, package语句的顺序是( )。 A. import ...

4645
来自专栏大神带我来搬砖

程序员的职业素养真是完全靠不住的东西

这里面<T extends Comparable<? super T>>有什么用?

501
来自专栏浪淘沙

关于栈的几个小算法

    想法就是创建一个index变量,index指向含有值得下一个数组空间(假设数组中有两个值,index指向2)

1027
来自专栏LanceToBigData

Java集合源码分析(二)Linkedlist

前言   前面一篇我们分析了ArrayList的源码,这一篇分享的是LinkedList。我们都知道它的底层是由链表实现的,所以我们要明白什么是链表? 一、Li...

2857
来自专栏一“技”之长

Swift专题讲解十七——Optional链 原

        Swift中的Optional值有这样的特性,当对其进行可选拆包时,即使用?进行Optional类型值的取值时,如果Optional值不为nil...

692
来自专栏格子的个人博客

Java源码阅读之LinkedList - JDK1.8

前文基于缓冲数组的ArrayList已经分析过,那么同样作为List实现的LinkedList又有什么不一样呢?

1052
来自专栏函数式编程语言及工具

泛函编程(1)-泛函编程是如何实现的

  泛函编程就是把函数组合起来形成一个完整的程序。可想而知,函数组合的过程可以是曲折的,形成的程序可以是复杂的。那么泛函编程又是如何保证一个复杂的函数组合程序是...

2358
来自专栏尾尾部落

[剑指offer] 栈的压入、弹出序列 [剑指offer] 栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序...

1202
来自专栏java 成神之路

java.lang.Void 解析与使用

2935

扫码关注云+社区

领取腾讯云代金券