一文学习Stream查找和匹配元素

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

  • 是否包含某一个“匹配规则”的元素
  • 是否所有的元素都符合某一个“匹配规则”
  • 是否所有元素都不符合某一个“匹配规则”
  • 查找第一个符合“匹配规则”的元素
  • 查找任意一个符合“匹配规则”的元素

这些需求如果用for循环去写的话,还是比较麻烦的,需要使用到for循环和break。下面使用Stream来完成这些操作。

何用Stream API来实现“查找与匹配”

Employee员工类:

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

创建10个员工:

    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");
    List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);

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

    boolean isExistAgeThan70 = false;
    for(Employee employee:employees){
      if(employee.getAge() > 70){
        isExistAgeThan70 = true;
        break;
      }
    }

使用Stream API实现,代码如下:

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());
  • findFirst用于查找第一个符合“匹配规则”的元素,返回值为Optional
  • indAny用于查找任意一个符合“匹配规则”的元素,返回值为Optional

结果:

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

Optional类代表一个值存在或者不存在。在java8中引入。

  • isPresent() 将在 Optional 包含值的时候返回 true , 否则返回 false 。
  • fPresent(Consumer block) 会在值存在的时候执行给定的代码块。
  • T get() 会在值存在时返回值,否则?出一个 NoSuchElement 异常。
  • T orElse(T other) 会在值存在时返回值,否则返回一个默认值。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

出世&入世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值