
在我們對陣列或者集合類進行操作的時候,經常會遇到這樣的需求,比如:
- 是否包含某一個“匹配規則”的元素
- 是否所有的元素都符合某一個“匹配規則”
- 是否所有元素都不符合某一個“匹配規則”
- 查找第一個符合“匹配規則”的元素
- 查找任意一個符合“匹配規則”的元素
這些需求如果用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用于查找第一個符合“匹配規則”的元素,回傳值為Optional
- findAny用于查找任意一個符合“匹配規則”的元素,回傳值為Optional
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/154817.html
標籤:Java
下一篇:集合類List底層資料結構總結
