
在我們對數組或者集合類進行操作的時候,經常會遇到這樣的需求,比如:
* 是否包含某一個“匹配規則”的元素
* 是否所有的元素都符合某一個“匹配規則”
* 是否所有元素都不符合某一個“匹配規則”
* 查找第一個符合“匹配規則”的元素
* 查找任意一個符合“匹配規則”的元素
這些需求如果用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<T> block) 會在值存在的時候執行給定的代碼塊。我們在第3章
介紹了 Consumer 函數式接口;它讓你傳遞一個接收 T 類型參數,并返回 void 的Lambda
表達式。
* T get() 會在值存在時返回值,否則?出一個 NoSuchElement 異常。
* T orElse(T other) 會在值存在時返回值,否則返回一個默認值。
> 關于Optinal的各種函數用法請觀看視頻
* findFirst用于查找第一個符合“匹配規則”的元素,返回值為Optional
* findAny用于查找任意一個符合“匹配規則”的元素,返回值為Optional
- 前言
- 1.lambda表達式會用了么
- 2.初識Stream-API
- 3.Stream的filter與謂語邏輯
- 4.Stream管道流的map操作
- 5.Stream的狀態與并行操作
- 6.Stream性能差?不要人云亦云
- 7.像使用SQL一樣排序集合
- 8.函數式接口Comparator
- 9.Stream查找與匹配元素
- 10.Stream集合元素歸約
- 11.StreamAPI終端操作
- 12.java8如何排序Map
- Stream流逐行文件處理
- java8-forEach(持續發布中)
- 筆者其它作品推薦
- vue深入淺出系列
- 手摸手教你學Spring Boot2.0
- Spring Security-JWT-OAuth2一本通
- 實戰前后端分離RBAC權限管理系統
- 實戰SpringCloud微服務從青銅到王者