你還在遍歷搜尋集合?別逗了!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 等方法,一行程式碼就能搞定搜尋。

比如現在有初始資料:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

使用者資訊分別為:姓名、年齡、性別。

filter(過濾)

使用 filter 方法實現自定義搜尋,比如搜尋 List 集合中

所有姓名含有 c 的人

輸出結果:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

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);}

輸出結果:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

示例是需要先 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());}

輸出結果:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

為什麼結果和 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”)));}

輸出結果:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

*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”)));}

輸出結果:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

這個方法的作用就和 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));}

輸出結果:

你還在遍歷搜尋集合?別逗了!Java 8 一行程式碼搞定,是真的優雅

總結

以上所有搜尋操作一行程式碼就能搞定,是不是很簡單優雅?

對於 List 之外的集合都可以轉換為 List,再轉換為 Stream 再進行搜尋操作,對於 Stream,搜尋簡直就是小兒科,你學廢用了嗎?

趕緊發給身邊的同事看看吧,讓你們的程式碼更優雅!

本文所有完整示例原始碼已經上傳:

https://github。com/javastacks/javastack

歡迎 Star 學習,後面 Java 示例都會在這上面提供!

作者:Java技術棧