java理論基礎(chǔ)Stream元素的匹配與查找

在我們對(duì)數(shù)組或者集合類進(jìn)行操作的時(shí)候,經(jīng)常會(huì)遇到這樣的需求,比如:
- 是否包含某一個(gè)“匹配規(guī)則”的元素
- 是否所有的元素都符合某一個(gè)“匹配規(guī)則”
- 是否所有元素都不符合某一個(gè)“匹配規(guī)則”
- 查找第一個(gè)符合“匹配規(guī)則”的元素
- 查找任意一個(gè)符合“匹配規(guī)則”的元素
這些需求如果用for循環(huán)去寫的話,還是比較麻煩的,需要使用到for循環(huán)和break!本節(jié)就介紹一個(gè)如何用Stream API來實(shí)現(xiàn)“查找與匹配”。
一、對(duì)比一下有多簡(jiǎn)單
employees是10個(gè)員工對(duì)象組成的List,在前面的章節(jié)中我們已經(jīng)用過多次,這里不再列出代碼。
如果我們不用Stream API實(shí)現(xiàn),查找員工列表中是否包含年齡大于70的員工?代碼如下:
boolean isExistAgeThan70 = false;
for(Employee employee:employees){
if(employee.getAge() > 70){
isExistAgeThan70 = true;
break;
}
}如果我們使用Stream API就是下面的一行代碼,其中使用到了我們之前學(xué)過的"謂詞邏輯"。
boolean isExistAgeThan70 = employees.stream().anyMatch(Employee.ageGreaterThan70);
將謂詞邏輯換成lambda表達(dá)式也可以,代碼如下:
boolean isExistAgeThan72 = employees.stream().anyMatch(e -> e.getAge() > 72);
所以,我們介紹了第一個(gè)匹配規(guī)則函數(shù):anyMatch,判斷Stream流中是否包含某一個(gè)“匹配規(guī)則”的元素。這個(gè)匹配規(guī)則可以是lambda表達(dá)式或者謂詞。
二、其他匹配規(guī)則函數(shù)介紹
是否所有員工的年齡都大于10歲?allMatch匹配規(guī)則函數(shù):判斷是夠Stream流中的所有元素都符合某一個(gè)"匹配規(guī)則"。
boolean isExistAgeThan10 = employees.stream().allMatch(e -> e.getAge() > 10);
是否不存在小于18歲的員工?noneMatch匹配規(guī)則函數(shù):判斷是否Stream流中的所有元素都不符合某一個(gè)"匹配規(guī)則"。
boolean isExistAgeLess18 = employees.stream().noneMatch(e -> e.getAge() < 18);
三、元素查找與Optional
從列表中按照順序查找第一個(gè)年齡大于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類代表一個(gè)值存在或者不存在。在java8中引入,這樣就不用返回null了。
isPresent() 將在 Optional 包含值的時(shí)候返回 true , 否則返回 false 。
ifPresent(Consumer block) 會(huì)在值存在的時(shí)候執(zhí)行給定的代碼塊。我們?cè)诘?章 介紹了 Consumer 函數(shù)式接口;它讓你傳遞一個(gè)接收 T 類型參數(shù),并返回 void 的Lambda 表達(dá)式。
T get() 會(huì)在值存在時(shí)返回值,否則?出一個(gè) NoSuchElement 異常。
T orElse(T other) 會(huì)在值存在時(shí)返回值,否則返回一個(gè)默認(rèn)值。
關(guān)于Optinal的各種函數(shù)用法請(qǐng)觀看視頻!B站觀看地址
findFirst用于查找第一個(gè)符合“匹配規(guī)則”的元素,返回值為Optional
findAny用于查找任意一個(gè)符合“匹配規(guī)則”的元素,返回值為Optional
以上就是java理論基礎(chǔ)Stream元素的匹配與查找的詳細(xì)內(nèi)容,更多關(guān)于java Stream元素匹配與查找的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在MyBatis中使用 # 和 $ 書寫占位符的區(qū)別說明
這篇文章主要介紹了在MyBatis中使用 # 和 $ 書寫占位符的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10
java 學(xué)習(xí)筆記(入門篇)_java的基礎(chǔ)語法
從基礎(chǔ)語法開始,這個(gè)語法你也可以理解為英語或是漢語里面的語法,只不過大家各有各的特點(diǎn)和區(qū)別;那么在學(xué)習(xí)的過程中我們就要不斷的積累重要的類和方法,這樣寫程序就會(huì)方便快捷了,下面就開始學(xué)習(xí)java的基礎(chǔ)語法2013-01-01
利用javadoc注釋自動(dòng)生成Swagger注解
由于現(xiàn)在controller方法上面沒有swagger注解,只能拿到接口url地址,無法獲得接口功能描述,所以本文為大家介紹一下如何利用javadoc注釋自動(dòng)生成Swagger注解,感興趣的可以了解下2023-08-08
Java中ThreadLocal使用原理及Synchronized區(qū)別
ThreadLocal叫做線程變量,本文詳細(xì)的介紹了ThreadLocal使用原理及Synchronized區(qū)別,有需要的朋友可以參考一下,希望對(duì)你有所幫助。2023-05-05
Logback動(dòng)態(tài)修改日志級(jí)別的方法
這篇文章主要介紹了Logback動(dòng)態(tài)修改日志級(jí)別的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11

