Java 中的 Predicate 是什麼
本教程通過 Java 示例介紹 Predicate
介面。
Predicate
是 Java 中的一個介面,用作 lambda 表示式或方法引用的目標賦值。它被新增到 Java 8 中,併為用 Java 編寫程式碼提供了一種更實用的方法。
它存在於 java.util.function
包中。Predicate
最常用於過濾物件流。在本教程中,我們將討論 Predicate
是什麼以及如何使用它。
Java 中的 Predicate
是什麼
如前所述,Predicate
是用作 lambda 表示式或方法引用的賦值目標的功能介面。Predicate 介面的語法如下所示。
@FunctionalInterface public interface Predicate<T>
T
是 Predicate
介面的輸入型別。讓我們舉個例子來說明 Predicate
是什麼。在數學世界中,Predicate
可以採用以下形式:
x -> x > 90
上面的語句表示,x
意味著 x
大於 90
。
讓我們看一個如何建立 Predicate
物件的示例。
Predicate<Integer> noGreaterThan5 = x -> x > 5;
在上面的程式碼中,我們建立了一個名為 noGreaterThan5
的 Predicate
。該 Predicate
採用整數輸入;因此,T
在這裡是整數。該 Predicate
將檢查輸入引數是否大於 5。
Java Stream 的 Filter()
操作中的 Predicate
Java 8 流 API 的 filter()
操作將 Predicate
作為其引數。在下面的程式碼中,我們將使用 filter()
操作來檢視 Predicate
介面的實現。看下面的程式碼:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String args[]) {
// predicate
Predicate<String> nameGreaterThan4 = x -> x.length() > 4;
// Create a list
List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
// create a stream
// apply filter operation
// pass the predicate
List<String> name_filtered =
name.stream().filter(nameGreaterThan4).collect(Collectors.toList());
// print the resulting list
System.out.println(name_filtered);
}
}
輸出:
[Karan, Aarya, Rahul, Pranav]
我們已經編寫了上面的程式碼來過濾長度大於 4 的名稱。我們首先建立一個 Predicate
和一個 List 來儲存名稱。
然後我們使用 List.toStream()
方法建立一個名稱流並應用 filter()
操作。過濾操作將 nameGreaterThan4
Predicate
作為其引數。
使用該 Predicate
的過濾操作只允許長度大於 4 的字串。與 Predicate
匹配的字串最終被 collect 操作收集並儲存到 List 中。
我們可以直接將 Predicate
傳遞給過濾函式,而不是單獨建立 Predicate
物件。看下面的程式碼:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String args[]) {
// Create a list
List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav");
// create a stream
// apply filter operation
// pass the predicate
List<String> name_filtered =
name.stream().filter(x -> x.length() > 4).collect(Collectors.toList());
// print the resulting list
System.out.println(name_filtered);
}
}
輸出:
[Karan, Aarya, Rahul, Pranav]
Java 中的 Predicate.and()
方法
我們可以使用 Predicate.and()
方法將兩個 Predicate
應用於過濾操作。它返回一個複合 Predicate
,該 Predicate
反映這個的邏輯與
並短路另一個 Predicate
。
如果在評估複合 Predicate
時此 Predicate
為假
,則不評估另一個 Predicate
。該方法的方法簽名是:
default Predicate<T> and(Predicate<? super T> other)
引數中的其他指的是我們可能想要應用的第二個 Predicate
。現在讓我們看一些例子來了解這種方法。看下面的程式碼:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String args[]) {
// predicate
Predicate<String> nameGreaterThan3 = x -> x.length() > 3;
Predicate<String> nameLesserThan5 = x -> x.length() < 5;
// Create a list
List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
// create a stream
// apply filter operation
// pass the predicate
List<String> name_filtered =
name.stream().filter(nameGreaterThan3.and(nameLesserThan5)).collect(Collectors.toList());
// print the resulting list
System.out.println(name_filtered);
}
}
輸出:
[Alok]
在上面的程式碼中,第一個 Predicate
檢查字串長度是否大於 3,第二個 Predicate
檢查字串長度是否小於 5。當這兩個 Predicate
都通過 AND
操作傳遞給過濾操作時,這過濾長度等於 4 的名稱。
上面的程式碼可以更簡潔地寫成如下:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String args[]) {
// create a list
List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
// create a stream
// apply filter operation
// pass the predicate
List<String> name_filtered =
name.stream().filter(x -> x.length() > 3 && x.length() < 5).collect(Collectors.toList());
// print the resulting list
System.out.println(name_filtered);
}
}
輸出:
[Alok]
Java 中的 Predicate.or()
方法
與前面的討論一樣,我們使用 and()
方法應用 AND
操作。我們還可以使用 or()
方法應用 OR
運算。
它返回一個複合 Predicate
,該 Predicate
反映了這個和另一個短路的 Predicate
的邏輯或
。如果該 Predicate
為真
,則在評估複合 Predicate
時不考慮另一個 Predicate
。
該方法的方法簽名是:
default Predicate<T> or(Predicate<? super T> other)
引數中的其他指的是我們可能想要應用的第二個 Predicate
。現在讓我們看一些例子來了解這種方法。看下面的程式碼:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String args[]) {
// predicate
Predicate<String> nameEqualTo3 = x -> x.length() == 3;
Predicate<String> nameEqualTo2 = x -> x.length() == 2;
// Create a list
List<String> name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
// create a stream
// apply filter operation
// pass the predicate
List<String> name_filtered =
name.stream().filter(nameEqualTo3.or(nameEqualTo2)).collect(Collectors.toList());
// print the resulting list
System.out.println(name_filtered);
}
}
輸出:
[Ram, Om]
在上面的程式碼中,第一個 Predicate
檢查字串長度是否等於 3,第二個 Predicate
檢查字串長度是否等於 5。當這兩個 Predicate
都通過 OR
操作傳遞給過濾器操作時,這過濾長度等於 3 或 2 的名稱。
上面的程式碼可以更簡潔地寫成如下:
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String args[]) {
// Create a list
List<String> je_name = Arrays.asList("Ram", "Karan", "Aarya", "Rahul", "Om", "Pranav", "Alok");
// create a stream
// apply filter operation
// pass the predicate
List<String> je_name_filtered = je_name.stream()
.filter(x -> x.length() == 3 || x.length() == 2)
.collect(Collectors.toList());
// print the resulting list
System.out.println(je_name_filtered);
}
}
輸出:
[Ram, Om]