java理論基礎(chǔ)Stream元素的匹配與查找
在我們對數(shù)組或者集合類進行操作的時候,經(jīng)常會遇到這樣的需求,比如:
- 是否包含某一個“匹配規(guī)則”的元素
- 是否所有的元素都符合某一個“匹配規(guī)則”
- 是否所有元素都不符合某一個“匹配規(guī)則”
- 查找第一個符合“匹配規(guī)則”的元素
- 查找任意一個符合“匹配規(guī)則”的元素
這些需求如果用for循環(huán)去寫的話,還是比較麻煩的,需要使用到for循環(huán)和break!本節(jié)就介紹一個如何用Stream API來實現(xiàn)“查找與匹配”。
一、對比一下有多簡單
employees是10個員工對象組成的List,在前面的章節(jié)中我們已經(jīng)用過多次,這里不再列出代碼。
如果我們不用Stream API實現(xiàn),查找員工列表中是否包含年齡大于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);
所以,我們介紹了第一個匹配規(guī)則函數(shù):anyMatch,判斷Stream流中是否包含某一個“匹配規(guī)則”的元素。這個匹配規(guī)則可以是lambda表達式或者謂詞。
二、其他匹配規(guī)則函數(shù)介紹
是否所有員工的年齡都大于10歲?allMatch匹配規(guī)則函數(shù):判斷是夠Stream流中的所有元素都符合某一個"匹配規(guī)則"。
boolean isExistAgeThan10 = employees.stream().allMatch(e -> e.getAge() > 10);
是否不存在小于18歲的員工?noneMatch匹配規(guī)則函數(shù):判斷是否Stream流中的所有元素都不符合某一個"匹配規(guī)則"。
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());
打印結(jié)果
Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin)
Optional類代表一個值存在或者不存在。在java8中引入,這樣就不用返回null了。
isPresent()
將在 Optional 包含值的時候返回 true , 否則返回 false 。
ifPresent
(Consumer block) 會在值存在的時候執(zhí)行給定的代碼塊。我們在第3章 介紹了 Consumer 函數(shù)式接口;它讓你傳遞一個接收 T 類型參數(shù),并返回 void 的Lambda 表達式。
T get()
會在值存在時返回值,否則?出一個 NoSuchElement 異常。
T orElse
(T other) 會在值存在時返回值,否則返回一個默認值。
關(guān)于Optinal的各種函數(shù)用法請觀看視頻!B站觀看地址
findFirst
用于查找第一個符合“匹配規(guī)則”的元素,返回值為Optional
findAny
用于查找任意一個符合“匹配規(guī)則”的元素,返回值為Optional
以上就是java理論基礎(chǔ)Stream元素的匹配與查找的詳細內(nèi)容,更多關(guān)于java Stream元素匹配與查找的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud及Nacos服務注冊IP選擇問題解決方法
這篇文章主要介紹了SpringCloud及Nacos服務注冊IP選擇問題,為什么注冊的IP和真實IP不符合呢,原因是Nacos客戶端在注冊服務時會從機器網(wǎng)卡中選擇一個IP來注冊,所以,當注冊了的是非真實IP后,另一臺機器調(diào)用時是不可能調(diào)通的,知道問題原因就是解決方法,一起看看吧2024-01-01Java使用Collections.sort對中文進行排序方式
這篇文章主要介紹了Java使用Collections.sort對中文進行排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Spring中@Configuration注解和@Component注解的區(qū)別詳解
這篇文章主要介紹了Spring中@Configuration注解和@Component注解的區(qū)別詳解,@Configuration 和 @Component 到底有何區(qū)別呢?我先通過如下一個案例,在不分析源碼的情況下,小伙伴們先來直觀感受一下這兩個之間的區(qū)別,需要的朋友可以參考下2023-09-09Spring?IOC容器Bean注解創(chuàng)建對象組件掃描
這篇文章主要為大家介紹了Spring?IOC容器Bean注解創(chuàng)建對象組件掃描,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證功能
這篇文章主要介紹了Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證,redisson是官方推薦的分布式鎖實現(xiàn)方案,采用redis自身的原子命令和lua腳本來實現(xiàn),需要的朋友可以參考下2022-05-05關(guān)于Springboot+gateway整合依賴并處理依賴沖突問題
這篇文章主要介紹了Springboot+gateway整合依賴并處理依賴沖突問題,給大家提到了spring boot版本和spring cloud版本,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01