Java 中的流過濾器
-
在 Java 中使用
filter()
和collect()
方法的流 -
Java 中帶有
filter()
和forEach()
方法的流 -
在 Java 中使用
filter()
和多個條件的流 -
在 Java 中使用
filter()
和map()
的流 -
在 Java 中堆疊多個
filter()
方法的流
本教程介紹 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 整除的元素平方。我們可以通過流水線化 filter
和 map
操作來做到這一點。
請參見下面的示例。
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