软件编程
位置:首页>> 软件编程>> java编程>> java理论基础Stream元素的匹配与查找

java理论基础Stream元素的匹配与查找

作者:字母哥哥  发布时间:2021-08-26 10:11:20 

标签:Stream,元素匹配,元素查找

java理论基础Stream元素的匹配与查找

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

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

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

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

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

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

这些需求如果用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<Employee> 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(Consumer block) 会在值存在的时候执行给定的代码块。我们在第3章 介绍了 Consumer 函数式接口;它让你传递一个接收 T 类型参数,并返回 void 的Lambda 表达式。

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

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

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

findFirst用于查找第一个符合&ldquo;匹配规则&rdquo;的元素,返回值为Optional

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

来源:https://zimug.blog.csdn.net/article/details/107032726

0
投稿

猜你喜欢

  • 在网上也没有找到好的解决方案,于是自己研究了下给解决了,分享给大家,希望对大家能有所帮助。一、异常信息这种情况是因为FTP设置的默认目录引发
  • 五丶封装(1)包的概念与创建1>概念在我们的电脑上有许多的文件,我们为了方便管理,大致给它们进行了不同的命名。然后在不同的文件夹下面再
  •     Quartz是一款开源的定时任务调度框架,Quartz的官网是:http://www.quartz-s
  • 软件行业发展到今天,国际化问题一直都占据非常重要的位置,而且应该越来越被重视。对于开发人员而言,在编写程序之前,国际化问题是首先要考虑的一个
  • 1、任何的高并发,请求总是会有一个顺序的2、java的队列的数据结构是先进先出的取值顺序3、BlockingQueue类(线程安全)(使用方
  • 一、前言在java中,和C语言一样,也有关于字符串的定义,并且有他自己特有的功能,下面我们一起来学习一下。二、String类概述string
  • 1、SpringSecurity 本质是一个过滤器链SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这
  • Mybatis映射文件mapper.xml的注释问题从昨天夜晚9点到今天中午,一直被项目bug所困惑,中间这段时间一直未解决这个问题,也咨询
  • 本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下Excel导入使用OpenFileDiolog
  •  介绍1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙。由蓝牙技术联盟(Bluetooth SI
  • 简介Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中
  • 健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态。本文在前文的基础上介绍如何自定义健康检查。
  • 本文实例为大家分享了viewGroup实现点击动画效果展示的具体代码,供大家参考,具体内容如下public class MyCustomVi
  • 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换
  • 这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。如果你也出现了这种情况,可以从下
  • 本文实例分析了C# SQlite操作方法。分享给大家供大家参考,具体如下:最近项目需求用C#保存一些数据,如此先总结一下。需要下载Sqlit
  • 冒泡排序冒泡排序的思想:每次让当前的元素和它的下一个元素比较大小、如果前一个的元素大于后一个元素的话,交换两个元素。这样的话经历一次扫描之后
  • 场景:在学习JDBC的语言中,每次都执行通用的几步:即注册驱动,获取连接,创建操作,处理结果,释放资源 过于复杂,因此不妨将上述步骤封装成工
  • 本文简要介绍如何使用Spring Cloud Gateway 作为API 网关(不是使用zuul作为网关),关于Spring Cloud G
  • 前言在现实项目中,数据量一般都不小,如果一次性全部请求出来,肯定是影响性能,而且大量数据展示到页面上观感也不好。这时我们就需要用到分页,给定
手机版 软件编程 asp之家 www.aspxhome.com