Java 8 Stream Filter詳解

一、Filter介紹

Stream是Java 8中處理集合的關鍵抽象概念。它可以看作是一種流式的 Iterator,它可以支持各種數據源的高效處理,無論數據源是集合、數組、I/O channel還是對其他具有流式操作的結果生成器。Stream API可大大提高Java程序的靈活性和可讀性。

Stream操作包括中間操作(Intermediary operations)和結束操作(Terminal Operations)。中間操作返回一個新的Stream對象,結束操作則返回一個非Stream的結果。

Filter是Stream最常見的中間操作之一。它可以使用一個Lambda表達式過濾出需要的元素,保留符合條件的元素。被Filter保留的元素將被用於後續操作,而不符合條件的元素將被丟棄。


List<String> list = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
List<String> javaList = list.stream().filter(str -> str.startsWith("Java")).collect(Collectors.toList());
System.out.println(javaList);
// output: [Java]

上述代碼中,我們使用filter方法過濾出以Java開頭的元素,並使用Collectors.toLilst()方法將結果轉換成List。

二、Filter使用方法

Filter可以用於各種數據源。下面,我們從數組、集合、Map三個方面詳細闡述Filter的使用方法。

1.數組

使用Stream對數組進行過濾非常簡單。只需要將數組轉換成Stream,然後使用filter方法即可。


Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> evenNumbers = Arrays.stream(numbers).filter(n -> n % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers);
// output: [2, 4, 6, 8, 10]

2.集合

使用Stream對集合進行過濾也非常簡單。只需要使用stream()方法將集合轉換成Stream,然後使用filter方法即可。


List<String> list = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
List<String> javaList = list.stream().filter(str -> str.startsWith("Java")).collect(Collectors.toList());
System.out.println(javaList);
// output: [Java]

3.Map

Map中的元素是以鍵值對的形式存在的。在使用filter對Map進行過濾時,我們需要根據需要過濾的條件,使用Map.Entry中的getKey()或getValue()方法獲取需要進行過濾的值。


Map<String, Integer> map = new HashMap<>();
map.put("Java", 20);
map.put("Scala", 6);
map.put("C++", 10);
map.put("Python", 15);
map.put("Ruby", 5);
List<String> popularLanguage = map.entrySet().stream().filter(entry -> entry.getValue() > 10)
    .map(Map.Entry::getKey).collect(Collectors.toList());
System.out.println(popularLanguage);
// output: [Java, Python]

三、Filter與Stream其它操作組合使用

Filter可以與Stream其它操作組合使用,使得程序變的更加靈活和高效。

1.排序(Sorted)

我們經常需要對數據進行排序。使用Stream可以非常方便的對數據進行排序。一般情況下,我們需要使用sorted方法對一些數據進行排序。


List<String> list = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
List<String> javaList = list.stream().filter(str -> str.startsWith("J"))
    .sorted().collect(Collectors.toList());
System.out.println(javaList);
// output: [Java, Java, JavaFX]

上述代碼中,我們過濾出以J開頭的元素,並對它們進行排序。

2.計數(Count)

使用count方法可以獲取Stream中元素的個數。


List<String> list = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
long javaCount = list.stream().filter(str -> str.startsWith("Java")).count();
System.out.println(javaCount);
// output: 1

3.查找(Find)

使用findFirst方法可以查找符合條件的第一個元素。使用findAny方法可以查找符合條件的任意一個元素。


List<String> list = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
Optional<String> javaOptional = list.stream().filter(str -> str.startsWith("Java")).findFirst();
System.out.println(javaOptional.get());
// output: Java

四、Filter小結

Filter是Stream中最常見的操作之一。它可以使用Lambda表達式過濾出需要的元素。Filter可以用於數組、集合、Map等各種數據源中。同時,Filter可以與Stream中的其它操作組合使用。

下面是一個完整的代碼示例:


public class StreamFilterDemo {
    public static void main(String[] args) {

        // 集合過濾
        List<String> list = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
        List<String> javaList = list.stream().filter(str -> str.startsWith("Java")).collect(Collectors.toList());
        System.out.println(javaList);

        // 數組過濾
        Integer[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<Integer> evenNumbers = Arrays.stream(numbers).filter(n -> n % 2 == 0).collect(Collectors.toList());
        System.out.println(evenNumbers);

        // Map過濾
        Map<String, Integer> map = new HashMap<>();
        map.put("Java", 20);
        map.put("Scala", 6);
        map.put("C++", 10);
        map.put("Python", 15);
        map.put("Ruby", 5);
        List<String> popularLanguage = map.entrySet().stream().filter(entry -> entry.getValue() > 10)
            .map(Map.Entry::getKey).collect(Collectors.toList());
        System.out.println(popularLanguage);

        // Filter和排序
        List<String> list2 = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
        List<String> javaList2 = list2.stream().filter(str -> str.startsWith("J"))
                .sorted().collect(Collectors.toList());
        System.out.println(javaList2);

        // Filter和計數
        List<String> list3 = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
        long javaCount = list3.stream().filter(str -> str.startsWith("Java")).count();
        System.out.println(javaCount);

        // Filter和查找
        List<String> list4 = Arrays.asList("Java", "Scala", "C++", "Python", "Ruby", "PHP", "Go");
        Optional<String> javaOptional = list4.stream().filter(str -> str.startsWith("Java")).findFirst();
        System.out.println(javaOptional.get());
    }
}

原創文章,作者:JNQCS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/325073.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JNQCS的頭像JNQCS
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論