最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?Stream流中的filter()使用方法舉例詳解

 更新時(shí)間:2024年11月01日 10:12:14   作者:昕er  
filter()是Java?Stream?API中的中間操作,用于根據(jù)給定的Predicate條件篩選流中的元素,它通過(guò)接收一個(gè)返回boolean值的函數(shù)(斷言)作為參數(shù),篩選出滿(mǎn)足條件的元素并收集到新的流中,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

filter() 是 Java Stream API 中的一個(gè)中間操作,用于根據(jù)給定的條件篩選流中的元素。它接收一個(gè) Predicate(斷言,即返回 boolean 的函數(shù))作為參數(shù),篩選出滿(mǎn)足條件的元素,并將它們收集到一個(gè)新的流中。

1. 基本用法

filter() 允許你基于某些條件篩選流中的元素。例如,如果你有一個(gè)整數(shù)流,并且只想保留其中的偶數(shù),可以使用 filter() 來(lái)實(shí)現(xiàn):

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> evenNumbers = numbers.stream()
    .filter(n -> n % 2 == 0)  // 保留偶數(shù)
    .collect(Collectors.toList());  // 終端操作,將結(jié)果收集為 List

System.out.println(evenNumbers);  // 輸出: [2, 4, 6]

在這個(gè)例子中:

  • filter(n -> n % 2 == 0):是一個(gè)篩選條件,用于保留那些能被 2 整除的數(shù)字,即偶數(shù)。
  • filter() 會(huì)遍歷流中的每個(gè)元素,使用該條件進(jìn)行檢查,滿(mǎn)足條件的元素會(huì)繼續(xù)留在流中,不滿(mǎn)足條件的元素會(huì)被丟棄。

2. Predicate 函數(shù)

filter() 的參數(shù)是一個(gè) Predicate 接口,這個(gè)接口只有一個(gè)抽象方法 boolean test(T t),它接收一個(gè)輸入并返回一個(gè) boolean 值。這個(gè) Predicate 用來(lái)定義篩選條件。

示例:篩選大于 3 的數(shù)字

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> greaterThanThree = numbers.stream()
    .filter(n -> n > 3)  // 保留大于 3 的數(shù)字
    .collect(Collectors.toList());

System.out.println(greaterThanThree);  // 輸出: [4, 5]

在這個(gè)例子中,n -> n > 3 是一個(gè) Predicate,它表示篩選出大于 3 的數(shù)字。filter() 方法根據(jù)這個(gè) Predicate 來(lái)保留滿(mǎn)足條件的元素。

3. 鏈?zhǔn)秸{(diào)用 filter()

你可以多次調(diào)用 filter(),來(lái)對(duì)流中的元素應(yīng)用多個(gè)條件。比如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

List<Integer> filteredNumbers = numbers.stream()
    .filter(n -> n > 3)    // 第一個(gè)條件: 大于 3
    .filter(n -> n < 8)    // 第二個(gè)條件: 小于 8
    .collect(Collectors.toList());

System.out.println(filteredNumbers);  // 輸出: [4, 5, 6, 7]

這里,filter() 被調(diào)用了兩次:

  • 第一個(gè) filter(n -> n > 3):篩選出大于 3 的數(shù)字。
  • 第二個(gè) filter(n -> n < 8):在剩余的數(shù)字中篩選出小于 8 的數(shù)字。

最終結(jié)果就是同時(shí)滿(mǎn)足這兩個(gè)條件的元素 [4, 5, 6, 7]

4. 空流

filter() 操作之后,流可能會(huì)變成空流。如果沒(méi)有任何元素滿(mǎn)足 filter() 的條件,流會(huì)變成空流,但不會(huì)拋出異常。這種情況下,后續(xù)的中間操作仍然可以應(yīng)用在空流上,只是沒(méi)有元素可以處理:

List<Integer> numbers = Arrays.asList(1, 2, 3);

List<Integer> result = numbers.stream()
    .filter(n -> n > 10)  // 沒(méi)有元素滿(mǎn)足條件
    .collect(Collectors.toList());

System.out.println(result);  // 輸出: []

在這個(gè)例子中,filter(n -> n > 10) 篩選出大于 10 的元素,但流中沒(méi)有元素滿(mǎn)足這個(gè)條件,所以最終返回的是一個(gè)空列表 []。

5. filter() 的惰性求值

filter() 是一種惰性操作,也就是 中間操作。它本身并不會(huì)立即執(zhí)行,而是等到流上的終端操作(如 collect()、forEach())被調(diào)用時(shí)才會(huì)執(zhí)行。

例如:

Stream<Integer> stream = Stream.of(1, 2, 3, 4)
    .filter(n -> {
        System.out.println("Filtering: " + n);
        return n % 2 == 0;
    });

System.out.println("Before terminal operation");

// 終端操作,觸發(fā) filter 執(zhí)行
List<Integer> evenNumbers = stream.collect(Collectors.toList());

System.out.println("After terminal operation: " + evenNumbers);

輸出結(jié)果為:

Before terminal operation
Filtering: 1
Filtering: 2
Filtering: 3
Filtering: 4
After terminal operation: [2, 4]

可以看到,在調(diào)用終端操作 collect() 之前,filter() 并沒(méi)有執(zhí)行;只有當(dāng)終端操作被調(diào)用時(shí),filter() 才真正開(kāi)始過(guò)濾元素。

6. 結(jié)合其他流操作使用

filter() 常常與其他流操作結(jié)合使用,比如 map()、sorted() 等。

示例:filter() 和 map() 結(jié)合使用

List<String> words = Arrays.asList("apple", "banana", "cherry", "date");

List<String> result = words.stream()
    .filter(word -> word.length() > 5)  // 篩選長(zhǎng)度大于 5 的單詞
    .map(String::toUpperCase)           // 將符合條件的單詞轉(zhuǎn)換為大寫(xiě)
    .collect(Collectors.toList());

System.out.println(result);  // 輸出: [BANANA, CHERRY]

在這個(gè)例子中:

  • filter(word -> word.length() > 5):篩選出長(zhǎng)度大于 5 的單詞。
  • map(String::toUpperCase):將剩下的單詞轉(zhuǎn)換為大寫(xiě)。
  • collect(Collectors.toList()):將流結(jié)果收集為一個(gè) List。

7. 組合多個(gè) Predicate 條件

有時(shí)候你可能需要對(duì)流中的元素應(yīng)用多個(gè)條件。你可以通過(guò) Predicate 的 and()、or()、negate() 等方法組合多個(gè)條件。

示例:篩選出大于 2 且是偶數(shù)的數(shù)字

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> result = numbers.stream()
    .filter(n -> n > 2 && n % 2 == 0)  // 組合條件: 大于 2 且為偶數(shù)
    .collect(Collectors.toList());

System.out.println(result);  // 輸出: [4, 6]

你也可以使用 Predicate 的組合方法:

Predicate<Integer> greaterThanTwo = n -> n > 2;
Predicate<Integer> isEven = n -> n % 2 == 0;

List<Integer> result = numbers.stream()
    .filter(greaterThanTwo.and(isEven))  // 使用 Predicate 的 and() 方法
    .collect(Collectors.toList());

System.out.println(result);  // 輸出: [4, 6]

這種方式能夠增強(qiáng)代碼的可讀性和重用性。

8. 在對(duì)象集合中使用 filter()

filter() 不僅可以用于簡(jiǎn)單類(lèi)型的流(如 IntegerString),也可以用于復(fù)雜對(duì)象的流。例如,在一個(gè)包含 Person 對(duì)象的列表中篩選年齡大于 18 的人:

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

List<Person> people = Arrays.asList(
    new Person("Alice", 22),
    new Person("Bob", 17),
    new Person("Charlie", 20)
);

List<Person> adults = people.stream()
    .filter(person -> person.age > 18)  // 篩選年齡大于 18 的人
    .collect(Collectors.toList());

System.out.println(adults);  // 輸出: [Alice (22), Charlie (20)]

總結(jié):

  • filter() 是一個(gè)中間操作,用于根據(jù)給定的 Predicate 對(duì)流中的元素進(jìn)行篩選,保留符合條件的元素。
  • 它不會(huì)改變?cè)氐念?lèi)型,只會(huì)決定哪些元素可以繼續(xù)傳遞到下一個(gè)流操作。
  • 由于 filter() 是惰性求值的,中間操作只有在終端操作被調(diào)用時(shí)才會(huì)執(zhí)行。
  • filter() 適合用于各種復(fù)雜對(duì)象的篩選,并且可以與 map() 等其他流操作結(jié)合使用。

到此這篇關(guān)于Java Stream流中的filter()使用方法的文章就介紹到這了,更多相關(guān)Java Stream流中filter()使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用IDEA如何將本地代碼上傳到GitCode

    使用IDEA如何將本地代碼上傳到GitCode

    文章主要介紹了使用GitCode進(jìn)行代碼倉(cāng)庫(kù)管理的步驟,包括注冊(cè)、創(chuàng)建倉(cāng)庫(kù)、IDEA創(chuàng)建本地倉(cāng)庫(kù)、設(shè)置遠(yuǎn)程倉(cāng)庫(kù)、配置賬號(hào)密碼和進(jìn)行代碼推送等操作,文章強(qiáng)調(diào)使用CSDN賬號(hào)同步注冊(cè),并使用個(gè)人訪問(wèn)令牌進(jìn)行操作,最后完成代碼的推送
    2026-04-04
  • Mybatis常見(jiàn)注解有哪些(總結(jié))

    Mybatis常見(jiàn)注解有哪些(總結(jié))

    這篇文章主要介紹了Mybatis常見(jiàn)注解有哪些(總結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring-cloud Config Server的3種配置方式

    Spring-cloud Config Server的3種配置方式

    這篇文章主要介紹了Spring-cloud Config Server的3種配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • idea中如何去掉不想commit的文件

    idea中如何去掉不想commit的文件

    這篇文章主要介紹了idea中如何去掉不想commit的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中executeQuery()和executeUpdate()的區(qū)別及說(shuō)明

    Java中executeQuery()和executeUpdate()的區(qū)別及說(shuō)明

    executeQuery()和executeUpdate()是JDBC中用于執(zhí)行SQL語(yǔ)句的方法,前者用于執(zhí)行查詢(xún)語(yǔ)句,返回ResultSet對(duì)象;后者用于執(zhí)行修改操作,返回受影響的行數(shù),使用這些方法時(shí)需要注意SQL語(yǔ)句的正確性、資源的釋放以及防止SQL注入
    2025-11-11
  • 一文深入理解Java中的深拷貝機(jī)制

    一文深入理解Java中的深拷貝機(jī)制

    在Java編程中,我們經(jīng)常需要處理對(duì)象的復(fù)制問(wèn)題,深拷貝和淺拷貝是兩種常見(jiàn)的復(fù)制方式,它們?cè)趦?nèi)存管理和對(duì)象引用方面存在不同特點(diǎn),本文將帶大家深入探究Java中的深拷貝機(jī)制,需要的朋友可以參考下
    2023-09-09
  • Java之Arrays的各種功能和用法總結(jié)

    Java之Arrays的各種功能和用法總結(jié)

    數(shù)組在?Java?中是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和操作大量數(shù)據(jù)。Arrays?是我們?cè)谔幚頂?shù)組時(shí)的一把利器。它提供了豐富的方法和功能,使得數(shù)組操作變得更加簡(jiǎn)單、高效和可靠。接下來(lái)我們一起看看?Arrays?的各種功能和用法,,需要的朋友可以參考下
    2023-05-05
  • 重新認(rèn)識(shí)Java中的ThreadLocal

    重新認(rèn)識(shí)Java中的ThreadLocal

    ThreadLocal是JDK包提供的,它提供線程本地變量,如果創(chuàng)建一個(gè)ThreadLocal變量,那么訪問(wèn)這個(gè)變量的每個(gè)線程都會(huì)有這個(gè)變量的一個(gè)副本,在實(shí)際多線程操作的時(shí)候,操作的是自己本地內(nèi)存中的變量,從而規(guī)避了線程安全問(wèn)題
    2021-05-05
  • Java編程Webservice指定超時(shí)時(shí)間代碼詳解

    Java編程Webservice指定超時(shí)時(shí)間代碼詳解

    這篇文章主要介紹了Java編程Webservice指定超時(shí)時(shí)間代碼詳解,簡(jiǎn)單介紹了webservice,然后分享了通過(guò)使用JDK對(duì)Webservice的支持進(jìn)行Webservice調(diào)用實(shí)現(xiàn)指定超時(shí)時(shí)間完整示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • spring使用Filter過(guò)濾器對(duì)Response返回值進(jìn)行修改的方法

    spring使用Filter過(guò)濾器對(duì)Response返回值進(jìn)行修改的方法

    這篇文章主要介紹了spring使用Filter過(guò)濾器對(duì)Response返回值進(jìn)行修改,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

芒康县| 龙里县| 专栏| 赣榆县| 海南省| 衡阳市| 霍州市| 定南县| 伊宁市| 肇源县| 桃江县| 仁布县| 大方县| 曲松县| 蓬安县| 旬阳县| 宝山区| 嘉善县| 凤台县| 宁都县| 南投县| 左权县| 娄烦县| 屏边| 河北省| 武山县| 离岛区| 沙雅县| 田林县| 光泽县| 运城市| 利辛县| 长白| 天全县| 北川| 姜堰市| 甘谷县| 秦皇岛市| 陕西省| 巴东县| 额尔古纳市|