你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅
背景
是的,如果你想搜尋 List 集合,在 Java 8 之前可以使用自身的 contains/ indexOf 方法來查詢元素,但僅限是完整元素,而不能模糊搜尋或者自定義搜尋,這時候確實只能遍歷。
但現在都 2021 年了,你還在使用傳統的遍歷集合的方式搜尋 List 集合元素嗎?
那你就太 out 了,使用 Java 8 中的 Stream 搜尋元素,一行程式碼即可搞定,而且還真的很優雅!這篇不會介紹 Stream 基礎,Stream 系列我之前寫過一個專題了,不懂的關注公眾號Java技術棧,然後在公眾號 Java 教程選單中閱讀。
Stream 搜尋
在 Java 8 中,可以將 List 集合轉換成 Stream,Stream 提供了一系列強大的搜尋功能,比如:filter、find*、*Match 等方法,一行程式碼就能搞定搜尋。
比如現在有初始資料:
使用者資訊分別為:姓名、年齡、性別。
filter(過濾)
使用 filter 方法實現自定義搜尋,比如搜尋 List
所有姓名含有 c 的人
:
輸出結果:
findFirst(查詢第一個)
查詢 Stream 中的第一個元素,比如搜尋 List
第一個年經大於 30 的人
:
/** * 集合搜尋第一個 * @author: 棧長 * @from: 公眾號Java技術棧 */@Testpublic void findFirst() { System。out。println(“搜尋第一個年經大於 30 的人”); User user = list。stream()。filter(u -> u。getAge() > 30)。findFirst()。get(); System。out。println(user);}
輸出結果:
示例是需要先 filter 再 findFirst ,但如果不要條件的話,filter 就不是必須的。
Stream 基礎不懂的可以關注公眾號Java技術棧,然後在公眾號 Java 教程選單中閱讀寫的 Java 系列教程。
findAny(查詢任意一個)
查詢 Stream 中的任意一個元素,比如搜尋 List
任意一個年經大於 30 的人
:
/** * 集合搜尋任意一個 * @author: 棧長 * @from: 公眾號Java技術棧 */@Testpublic void findAny() { System。out。println(“搜尋任意一個年經大於 30 的人”); User user = list。stream()。filter(u -> u。getAge() > 30)。findAny()。get(); System。out。println(user。getName());}
輸出結果:
為什麼結果和 findFirst 一樣?和 findFirst 有什麼區別呢?
findAny 是查詢任意一個元素,在序列流中如果資料較少,一般會返回第一個元素,但在並行流中它返回的結果就不確定了,它可能是流中的任何元素。
findAny 的目的是為了提高並行流操作的效能,但如果需要一個固定的結果,建議使用 findFirst。
本文所有完整示例原始碼已經上傳:
https://github。com/javastacks/javastack
anyMatch(任意匹配)
查詢 Stream 中的元素是否存在任意匹配,比如搜尋 List
是否存在 XX 人
:
/** * 集合匹配任意元素 * @author: 棧長 * @from: 公眾號Java技術棧 */@Testpublic void anyMatch() { System。out。println(“是否存在 Jack:” + list。stream()。anyMatch(u -> u。getName()。contains(“Jack”))); System。out。println(“是否存在 Jet:” + list。stream()。anyMatch(u -> u。getName()。contains(“Jet”)));}
輸出結果:
*Match 返回的結果是 boolean 型別。
noneMatch(空匹配)
查詢 Stream 中的元素是否不存在匹配,比如搜尋 List
是否不存在 XX 人
:
/** * 集合不匹配任意元素 * @author: 棧長 * @from: 公眾號Java技術棧 */@Testpublic void noneMatch() { System。out。println(“是否不存在 Jack:” + list。stream()。noneMatch(u -> u。getName()。contains(“Jack”))); System。out。println(“是否不存在 Jet:” + list。stream()。noneMatch(u -> u。getName()。contains(“Jack”)));}
輸出結果:
這個方法的作用就和 anyMatch 相反。
allMatch(全匹配)
查詢 Stream 中的元素是否全部匹配,比如搜尋 List
所有人的年紀是否都大於 XX
:
/** * 集合匹配全部元素 * @author: 棧長 * @from: 公眾號Java技術棧 */@Testpublic void allMatch() { System。out。println(“所有人的年紀都大於3:” + list。stream()。allMatch(u -> u。getAge() > 2)); System。out。println(“所有人的年紀都大於30:” + list。stream()。allMatch(u -> u。getAge() > 30));}
輸出結果:
總結
以上所有搜尋操作一行程式碼就能搞定,是不是很簡單優雅?
對於 List 之外的集合都可以轉換為 List,再轉換為 Stream 再進行搜尋操作,對於 Stream,搜尋簡直就是小兒科,你學廢用了嗎?
趕緊發給身邊的同事看看吧,讓你們的程式碼更優雅!
本文所有完整示例原始碼已經上傳:
https://github。com/javastacks/javastack
歡迎 Star 學習,後面 Java 示例都會在這上面提供!
作者:Java技術棧