恕我直言你可能真的不會java第9篇-Stream元素的匹配與查詢

字母哥部落格 發表於 2020-06-30

恕我直言你可能真的不會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的各種函式用法請觀看視訊!B站觀看地址

  • findFirst用於查詢第一個符合“匹配規則”的元素,返回值為Optional
  • findAny用於查詢任意一個符合“匹配規則”的元素,返回值為Optional

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。