Java 中的流過濾器

Mohammad Irfan 2023年1月30日 2022年5月1日
  1. 在 Java 中使用 filter()collect() 方法的流
  2. Java 中帶有 filter()forEach() 方法的流
  3. 在 Java 中使用 filter() 和多個條件的流
  4. 在 Java 中使用 filter()map() 的流
  5. 在 Java 中堆疊多個 filter() 方法的流
Java 中的流過濾器

本教程介紹 Java 中的流 API 及其 filter() 方法。在 Java 中,流是物件的集合。

流不儲存任何資料,因此它不是資料結構。流具有各種方法,可以將它們一起流水線化以獲得所需的結果。

其中一種方法是 filter 方法。我們將看到使用本文的 filter() 操作的各種示例。

讓我們首先了解 filter() 操作。filter() 方法返回一個帶有元素的新流,這些元素與作為引數傳遞給它的謂詞匹配。

換句話說,filter() 操作用於過濾傳入流並輸出新流。此方法的語法是:

Stream<T> filter(Predicate<? super T> predicate)

謂詞是一個函式介面,這意味著我們可以在這裡傳遞一個 lambda 函式或方法引用。現在讓我們看一些例子。

在 Java 中使用 filter()collect() 方法的流

collect() 操作是一種終端操作。

終端操作在最後應用於流以產生結果。應用終端運算元後,流被消費,不能再消費。

collect() 操作返回中間操作的輸出;它還可用於將輸出轉換為所需的資料結構。看下面的例子。

假設我們有一個班級中所有學生的列表,並且我們想要建立一個新列表,其中包含除一個之外的所有學生的姓名。假設一名學生離開了學校。

我們可以通過這個給定的程式碼來做到這一點。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<String> students = Arrays.asList("Kashish", "Riyan", "Ritu");
        
        List<String> new_students = students.stream().filter(sName -> !"Riyan".equals(sName)).collect(Collectors.toList());
        
        new_students.forEach(System.out::println);
    }
}

輸出:

Kashish
Ritu

在這段程式碼中,首先建立了一個學生姓名流。

然後使用謂詞過濾流:所有不等於 Riyan 的名稱。filter 操作生成一個新流,其中包含滿足該謂詞的所有元素。

然後使用 collect 操作將新建立的流轉換為 List

Java 中帶有 filter()forEach() 方法的流

forEach() 方法也是一個終端操作。它將作為引數傳遞的函式應用於每個流元素。

它的工作方式類似於 foreach 迴圈,但僅適用於流。請參見下面的示例。

假設我們要列印所有能被 5 整除的數字。下面的程式碼就是這樣工作的。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,21,11,10,25);
        
        numbers.stream().filter(n -> n % 5 == 0).forEach(System.out::println);
    }
}

輸出:

5
10
25

在 Java 中使用 filter() 和多個條件的流

我們可以使用邏輯運算子將多個條件傳遞給 filter() 操作以獲得更精細的結果。假設我們要找出所有能被 5 整除且大於 10 的元素;請參見下面的示例。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,21,11,10,25);
        
        numbers.stream().filter(n -> n % 5 == 0 && n > 10).forEach(System.out::println);
    }
}

輸出:

25

在 Java 中使用 filter()map() 的流

map() 操作就像 forEach() 操作。

它將一個函式應用於流的每個元素。它是一種中間操作,而不是終端操作。

假設我們必須將所有可被 5 整除的元素平方。我們可以通過流水線化 filtermap 操作來做到這一點。

請參見下面的示例。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,21,11,10,25);
        
        List<Integer> new_numbers = numbers.stream().filter(n -> n % 5 == 0).map(x -> x * x).collect(Collectors.toList());
        
        new_numbers.forEach(System.out::println);
    }
}

輸出:

25
100
625

在上面的程式碼中,首先過濾整數列表。過濾列表後,流中剩餘的每個元素都使用 map() 操作進行平方。

最後,我們將流轉換為列表並將其儲存在 new_numbers 列表中。

在 Java 中堆疊多個 filter() 方法的流

我們可以通過一個接一個地應用來堆疊 filter() 方法以獲得更精細的結果。

假設我們首先要過濾長度大於 3 的字串,然後過濾包含 stack 作為子字串的字串。我們可以通過使用下面的程式碼示例來做到這一點。

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<String> str = Arrays.asList("Hello", "I" , "Love", "Delftstack");
        
        List<String> new_string = str.stream().filter(n -> n.length() > 3).filter(n -> n.contains("stack")).collect(Collectors.toList());
        
        new_string.forEach(System.out::println);
    }
}

輸出:

Delftstack

請注意,上面的程式碼等效於使用 && 運算子使用多個條件。往下看:

import java.util.*;
import java.util.stream.Collectors;
public class MyClass {
    public static void main(String args[]) {
        List<String> str = Arrays.asList("Hello", "I" , "Love", "Delftstack");
        
        List<String> new_string = str.stream().filter(n -> n.length() > 3 && n.contains("stack")).collect(Collectors.toList());
        
        new_string.forEach(System.out::println);
    }
}

輸出:

Delftstack

相關文章 - Java Method

相關文章 - Java Stream