Java 8引入的stream()是一個強大的工具,它讓集合操作變得更加簡單和優雅。stream()中的filter()方法是stream()的一個重要部分,它可以對數據進行篩選和過濾,讓我們只留下需要的數據。因此,本文將介紹如何使用Java中的stream().filter方法。
一、filter()方法的定義和用途
filter()方法是一個中間操作,它接受一個lambda表達式作為參數,該表達式返回一個boolean類型的值。它的作用是過濾掉不需要的元素,只保留需要的元素。
在 stream().filter() 方法中,我們需要傳入一個謂詞(Predicate)參數,這個謂詞接受一個類型為T的對象作為輸入,返回一個布爾值:
public interface Predicate<T> {
boolean test(T t);
}
下列代碼可以對一個list列表進行過濾,讓最終的結果只保留age屬性大於等於18的元素:
List<Person> people = getPeople();
List<Person> adultPeople = people.stream()
.filter(person -> person.getAge() >= 18)
.collect(Collectors.toList());
其中getPeople()方法返回了一個Person類型的List,Person對象有一個age屬性。
二、filter()方法和其他Stream API的聯合使用
1. 將過濾後的結果轉換為一個數組
在上述示例中,使用collect(Collectors.toList())方法將過濾後的結果轉換為一個List,但是我們也可以將它轉換為一個數組:
List<Person> people = getPeople();
Person[] adultPeople = people.stream()
.filter(person -> person.getAge() >= 18)
.toArray(Person[]::new);
其中toArray()方法的參數類型是一個 IntFunction<T[]>泛型接口,它的聲明如下:
@FunctionalInterface
public interface IntFunction<R> {
R apply(int value);
}
該接口接受一個 int 值,返回一個指定類型的結果。 在本例中,我們將 toArray() 的參數設置為構造器引用Person[]::new,創建一個 Person 類型的數組作為結果。
2. 過濾流中的某個特定值
我們可以使用 filter() 方法輕鬆地過濾掉某個特定的值。在下面的例子中,我們將過濾掉字符串列表中的”Sam”。
List<String> names = Arrays.asList("John", "Sam", "Alex");
List<String> updatedNames = names.stream()
.filter(name -> !"Sam".equals(name))
.collect(Collectors.toList());
在這個例子中,我們使用 “!” 作為邏輯非運算符。 因此,當 name 的值與 “Sam” 相等時,謂詞將返回 false。如此一來,Sam 就被過濾掉了。
3. 過濾集合中的重複元素
我們可以使用 Stream 類中的 distinct() 方法來過濾集合中的重複元素。在下列示例中,展示了如何使用 distinct() 方法來篩選出一個列表的唯一元素:
List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 4, 5, 5, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
在這個例子中,我們將 numbers 列表中的重複元素過濾掉,並使用 collect(Collectors.toList()) 方法將結果轉換為一個List對象.
三、常見錯誤以及如何避免它們
1. NullPointerException
如果在filter()方法中傳入了一個null值,就會拋出NullPointerException異常。為了避免這種錯誤,我們應該檢查集合中是否包含空值,或者使用Optional類:
List<Person> people = getPeople();
List<Person> nonNullPeople = people.stream()
.filter(Objects::nonNull)
.filter(person -> person.getAge() >= 18)
.collect(Collectors.toList());
在上述示例中,我們使用了一個名為 Objects.nonNull() 的靜態方法,它可以檢查一個對象是否為 null,如果不是就返回 true。
2. 類型轉換問題
在進行類型轉換時,經常會出現 ClassCastException。為了避免這種情況,我們可以使用instanceof運算符來檢查類型是否一致:
Object[] values = {1, "Sam", 2.0f, };
List<String> stringValues = Arrays.stream(values)
.filter(String.class::isInstance)
.map(String.class::cast)
.collect(Collectors.toList());
在上述示例中,我們使用isInstance()方法檢查元素是否為String,如果是String,map()方法就會將其強制轉換為String類型。
3. 並行處理效率問題
在使用stream()方法進行並行處理時,我們也需要注意效率問題。並行處理需要在內存中創建多個線程來處理不同的數據塊,這可能會導致操作效率變慢。 因此,在進行並行處理時,我們需要仔細考慮輸入數據的大小、內存使用情況和硬件設備。
在下列示例中,我們展現了如何使用parallel()方法進行並行處理:
List<Person> people = getPeople();
List<Person> adultPeople = people.parallelStream()
.filter(person -> person.getAge() >= 18)
.collect(Collectors.toList());
四、總結
Java中的filter()方法提供了一個簡單而優雅的方式來處理集合中的元素,讓我們只留下我們需要的數據。在介紹了Java中的stream().filter方法及其常見用法後,我們應該注意一些常見的錯誤,如空類型和類型轉換。
作為Java開發者,熟練掌握stream().filter方法可以使我們更加有效地編寫高質量的代碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/231447.html