恕我直言你可能真的不會java第9篇-Stream元素的匹配與查詢
在我們對陣列或者集合類進行操作的時候,經常會遇到這樣的需求,比如:
- 是否包含某一個“匹配規則”的元素
- 是否所有的元素都符合某一個“匹配規則”
- 是否所有元素都不符合某一個“匹配規則”
- 查詢第一個符合“匹配規則”的元素
- 查詢任意一個符合“匹配規則”的元素
這些需求如果用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的各種函式用法請觀看影片!
- findFirst用於查詢第一個符合“匹配規則”的元素,返回值為Optional
- findAny用於查詢任意一個符合“匹配規則”的元素,返回值為Optional
歡迎關注我的部落格,裡面有很多精品合集
- 本文轉載註明出處(必須帶連線,不能只轉文字):。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2558/viewspace-2825753/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 恕我直言你可能真的不會java第4篇:Stream管道流Map操作Java
- 恕我直言你可能真的不會java第3篇:Stream的Filter與謂詞邏輯JavaFilter
- 恕我直言你可能真的不會java第5篇:Stream的狀態與並行操作Java並行
- 恕我直言你可能真的不會java第6篇:Stream效能差?不要人云亦云Java
- 恕我直言你可能真的不會java第8篇-函式式介面Java函式
- 恕我直言你可能真的不會java第7篇:像使用SQL一樣排序集合JavaSQL排序
- 我覺得你可能真的還不會JavaJava
- 恕我直言,我懷疑你並不會用 Java 列舉Java
- 你真的會用二分查詢嗎?
- jQuery查詢第n個li元素jQuery
- 查詢陣列中第K大的元素陣列
- 分頁查詢,你真的懂嗎?
- Java中查詢列表的峰值元素Java
- Selenium webdriver Java 查詢元素WebJava
- 恕我直言,你可能連 GitHub 搜尋都不會用 - 如何精準搜尋的神仙技巧Github
- 通過SQL查詢兩張表中不匹配的行SQL
- 二分查詢--你真的掌握了嗎?
- 二分查詢,你真的掌握了嗎?
- Java內部類你真的會嗎?Java
- [轉]恕我直言,在座的各位根本不會寫 Java!Java
- 【Java】陣列二分查詢元素Java陣列
- 不會改變操作物件內容的STL演算法(元素查詢,序列查詢,統計元素個數,比較區間,找最值)物件演算法
- 你真的會閱讀Java的異常資訊嗎?Java
- 前端週刊第64期:你真的會提問麼?前端
- JAVA中正規表示式匹配,替換,查詢,切割的方法Java
- css如何匹配倒數第n個元素CSS
- jquery 查詢某個元素的父元素jQuery
- 細思極恐 - 你真的會寫 Java 嗎?Java
- 細思極恐-你真的會寫java嗎?Java
- 在Java中,你真的會日期轉換嗎Java
- 你真的會用 Java 中的三目運算子嗎?Java
- 關於mysql查詢字符集不匹配問題的解決方法MySql
- c++map 查詢元素和list查詢元素速度對比C++
- Java中使用流Stream查詢列表中的最大和最小日期Java
- 陣列的主元素查詢陣列
- jQuery之元素查詢jQuery
- 讓CSS的查詢匹配原理變高效CSS
- 關於字串匹配查詢的總結字串匹配