Java 中的 Predicate 是什麼

Mohammad Irfan 2023年10月12日
  1. Java 中的 Predicate 是什麼
  2. Java Stream 的 Filter() 操作中的 Predicate
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>

TPredicate 介面的輸入型別。讓我們舉個例子來說明 Predicate 是什麼。在數學世界中,Predicate 可以採用以下形式:

x -> x > 90

上面的語句表示,x 意味著 x 大於 90

讓我們看一個如何建立 Predicate 物件的示例。

Predicate<Integer> noGreaterThan5 = x -> x > 5;

在上面的程式碼中,我們建立了一個名為 noGreaterThan5Predicate。該 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]

相關文章 - Java Interface