> ## Content Index
> Fetch the complete content index at: https://lucent.blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# Stream查找与匹配元素
- URL: https://lucent.blog/streamcha-zhao-yu-pi-pei-yuan-su/
- Published: 2020-06-25T09:42:04.000Z
- Updated: 2026-08-21T00:49:56.000Z
- Author: Lucent
- Tags: java, Stream API

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

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

这些需求如果用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) 会在值存在时返回值，否则返回一个默认值。