在我们对数组或者集合类进行操作的时候,经常会遇到这样的需求,比如:

是否包含某一个“匹配规则”的元素

是否所有的元素都符合某一个“匹配规则”

是否所有元素都不符合某一个“匹配规则”

查找第一个符合“匹配规则”的元素

查找任意一个符合“匹配规则”的元素

这些需求如果用for循环去写的话,还是比较麻烦的,需要使用到for循环和break!本节就介绍一个如何用Stream API来实现“查找与匹配”。

一、对比一下有多简单

employees是10个员工对象组成的List,在前面的章节中我们已经用过多次,这里不再列出代码。

如果我们不用Stream API实现,查找员工列表中是否包含年龄大于70的员工?代码如下:

boolean isExistAgeThan70 = false;

for(Employee employee:employees){

if(employee.getAge() > 70){

isExistAgeThan70 = true;

break;

}

}

如果我们使用Stream API就是下面的一行代码,其中使用到了我们之前学过的"谓词逻辑"。

boolean isExistAgeThan70 = employees.stream().anyMatch(Employee.ageGreaterThan70);

将谓词逻辑换成lambda表达式也可以,代码如下:

boolean isExistAgeThan72 = employees.stream().anyMatch(e -> e.getAge() > 72);

所以,我们介绍了第一个匹配规则函数:anyMatch,判断Stream流中是否包含某一个“匹配规则”的元素。这个匹配规则可以是lambda表达式或者谓词。

二、其他匹配规则函数介绍

是否所有员工的年龄都大于10岁?allMatch匹配规则函数:判断是够Stream流中的所有元素都符合某一个"匹配规则"。

boolean isExistAgeThan10 = employees.stream().allMatch(e -> e.getAge() > 10);

是否不存在小于18岁的员工?noneMatch匹配规则函数:判断是否Stream流中的所有元素都不符合某一个"匹配规则"。

boolean isExistAgeLess18 = employees.stream().noneMatch(e -> e.getAge() < 18);

三、元素查找与Optional

从列表中按照顺序查找第一个年龄大于40的员工。

Optional employeeOptional

= employees.stream().filter(e -> e.getAge() > 40).findFirst();

System.out.println(employeeOptional.get());

打印结果

Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)

Optional类代表一个值存在或者不存在。在java8中引入,这样就不用返回null了。

isPresent() 将在 Optional 包含值的时候返回 true , 否则返回 false 。

ifPresent(Consumerblock) 会在值存在的时候执行给定的代码块。我们在第3章

介绍了 Consumer 函数式接口;它让你传递一个接收 T 类型参数,并返回 void 的Lambda

表达式。

T get() 会在值存在时返回值,否则?出一个 NoSuchElement 异常。

T orElse(T other) 会在值存在时返回值,否则返回一个默认值。

关于Optinal的各种函数用法请观看视频!B站观看地址

findFirst用于查找第一个符合“匹配规则”的元素,返回值为Optional

findAny用于查找任意一个符合“匹配规则”的元素,返回值为Optional

欢迎关注我的博客,里面有很多精品合集

本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

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

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

    一.基础代码准备 建立一个实体类,该实体类有五个属性.下面的代码使用了lombok的注解Data.AllArgsConstructor,这样我们就不用写get.set方法和全参构造函数了.lombok ...

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

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

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

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

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

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

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

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

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

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

  7. 细思极恐,你真的会写 Java 吗

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 非常非常不错的一篇文章,文中提到的很多实践都 ...

  8. 细思极恐-你真的会写java吗?

    细思极恐-你真的会写java吗? 导语 自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个ja ...

  9. 你真的会写Java吗?

    导语 自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个java程序员,那你真的会写java吗 ...

最新文章

  1. TCP连接过程:三次握手与四次握手—Vecloud微云
  2. 据中心水冷系统备品备件管理新思路
  3. boost::math模块计算二项式随机变量的概率和分位数的简单示例
  4. 2017-2018-1 20155301 《信息安全系统设计基础》第7周学习总结
  5. Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之与其它Fragment通信
  6. linux修改文件用户组,linux命令 修改文件、文件夹所属用户、用户组
  7. 【转】C# SqlServer操作辅助类(SqlServerHelper.cs)
  8. 什么是cmm3规范?什么是CMMI5 呢?
  9. Linux-虚拟机封装
  10. win10系统下mysql5.7初始化失败怎么办?
  11. MIRACL大数运算库使用手册
  12. 老虎证券爬取港股(对小米股价的实时显示和报警)
  13. 1.初识elasticsearch
  14. verilog奇偶分频详解
  15. 概率统计·参数估计【矩估计、极大似然估计、无偏性、有效性、相合性】
  16. ReSharper:著名的VS代码生成工具
  17. java调用海康威视sdk获取车牌号demo
  18. QML+cmake 下取消打印 QML debugging is enabled.Only use this in a safe environment.
  19. 不是汽车之家太牛,而是其他网站太懒
  20. 如何解决Labview卸载不干净,error1721的问题

热门文章

  1. 零散的JavaScript公用方法
  2. spring - ioc和aop
  3. 深入浅出Node.js(一):什么是Node.js
  4. C语言之“#“和“##“用法(十四)
  5. git报错:ssh variant 'simple' does not support setting port解决
  6. wireshark网络分析笔记
  7. 一个简单的Hook demo
  8. android中openMax的实现
  9. mount -o nolock
  10. Windows Server 2016 搭建 FTP服务