CodeGym /Java Blog /Toto sisi /帶有示例的 Java 謂詞
John Squirrels
等級 41
San Francisco

帶有示例的 Java 謂詞

在 Toto sisi 群組發布
通常謂詞是指確定一個值是真還是假的陳述。在編程中,謂詞是指具有一個返回布爾值的參數的函數。Functional Interface Predicate 是在 Java 8 中實現的。“Functional”意味著它只包含一個抽象方法。它接受一個參數並返回一個布爾值。在 Java 中,函數式接口用於處理 Lambda 表達式、構造函數和方法引用。通常 Java 8 Predicate 用於為對象集合應用過濾器。下面我們來看看它的主要應用和廣泛使用的方法,以及解決一些實踐問題。 Java 謂詞示例 - 1

為什麼開發人員使用謂詞

基本上,開發人員可以將謂詞用於任何涉及根據預定義標準評估項目並返回布爾值的任務。 以下是開發人員使用謂詞處理的簡單任務的示例:
  • 過濾一組整數。
  • 通過確保數據符合多個預定義條件來對列表進行排序(例如,通過設置價格和重量條件來組織一系列項目)。
  • 在並發編程中使用實用程序包。
謂詞是軟件測試中的一個重要特徵。功能接口使得測試單元分離更容易,提高了應用程序代碼的可讀性和可管理性。

Java 中的謂詞語法

java.util.function.Predicate是在 Java 8 中引入的,作為處理 Lambda 評估印象的替代方法。接口的標準視圖是Predicate<T>,其中 T 是返回布爾值的單個參數。Java Predicates 有一個功能性(抽象)方法test(Object)可以在給定的 Object 上評估這個謂詞。

@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
下面是一個編寫簡單 Predicate 的示例,該 Predicate 根據“大於”、“小於”條件過濾整數。

// An example of a simple Java predicate
  
import java.util.function.Predicate; 
public class PredicateExample { 
    public static void main(String[] args) 
    { 
        // Creating predicate 
        Predicate<Integer> lesserThan = i -> (i < 18);  
  
        // Calling Predicate method 
        System.out.println(lesserThan.test(10));  
    }
}
輸出將為真,因為 10 < 18。再舉一個在filter()中使用 Predicate 的示例。謂詞有助於從年齡列表中過濾出所有成年人。

  import java.util.List;
  import java.util.function.Predicate;

  public class PredicateExample {
      public static void main(String[] args) {
          List<Integer> ages = List.of(17, 18, 19, 28, 18, 28, 46, 7, 8, 9, 21, 12);
          NotLessThan18<Integer> isAdult = new NotLessThan18<>();
          ages.stream().filter(isAdult).forEach(System.out::println);
      }
  }



class NotLessThan18<E> implements Predicate<Integer> {

      @Override
      public boolean test(Integer v) {
          Integer ADULT = 18;
          return v >= ADULT;
      }
  }
輸出是:
18 19 28 18 28 46 21

Java 8 謂詞方法

Predicate 接口有一些方法。
  • boolean test(T t)評估給定參數的謂詞。
  • default Predicate<T> and(Predicate<? super T> other)返回表示此謂詞與另一個謂詞的短路邏輯 AND 的謂詞。
  • default Predicate<T> or返回一個組合謂詞,表示此謂詞與另一個謂詞的短路邏輯或。
  • default Predicate<T> negate()返回邏輯上與此謂詞相反的謂詞。
  • 默認 Predicate<T> isEqual(Object targetRef)根據Objects.equals(Object, Object)返回兩個參數是否相等的測試結果。

布爾測試(T t)

這是 Java 謂詞的一種功能方法,用於評估給定參數是否滿足謂詞的條件。示例:這裡我們為所有年滿 18 歲的人創建一個謂詞 adult。test()方法獲取一個整數值並檢查它。

import java.util.function.Predicate;
public class PredicateTestTest {
   public static void main(String[] args) {
       Predicate<Integer> adult = i -> i >= 18;
       System.out.println(adult.test(12));
       System.out.println(adult.test(19));
       System.out.println(adult.test(21));
   }
}
上面代碼的輸出是什麼?在第一種情況下,因為 12 小於 18,所以它是假的。至於第二種和第三種情況,滿足條件所以返回為真。
假 真 真

默認 Predicate.and()

此方法表示“和”運算符。這就是為什麼如果給定謂詞之一不符合設定條件,則另一個謂詞將不會得到評估。示例:讓我們用 Java 編寫謂詞,使用and()過濾所有已經成年但小於 65 歲的人。讓我們使用predicate.add()並為這些條件編寫一個帶有 lambda 的 java 謂詞:如果條件為真,應用程序將返回以下語句:

import java.util.function.Predicate;

   public class PredicateDemo {
       public static void main(String[] args) {
           Predicate<Integer> adultYet = i -> i >= 18;
           Predicate<Integer> adultStill = i -> i < 65;
           System.out.println(adultYet.and(adultStill).test(5));
           System.out.println(adultYet.and(adultStill).test(38));
           System.out.println(adultYet.and(adultStill).test(90));
       }
   }
輸出是:
假 真 假

默認 Predicate.or()

Predicate.or()方法表示“或”運算符。這意味著即使兩個謂詞之一為真而另一個為假,條件也將保持為真。示例:讓我們現在評估字符串。嘗試使用 OR 方法對包含子字符串“my”或“crayon”的所有短語進行排序。

import java.util.function.Predicate;

  public class PredicateDemo2 {
      public static void main(String[] args) {
          Predicate<String> containsA = t -> t.contains("crayon");
          Predicate<String> containsB = t -> t.contains("my");
          System.out.println(containsA.or(containsB).test("here is my crayon"));
          System.out.println(containsA.or(containsB).test("here is my pencil"));
          System.out.println(containsA.or(containsB).test("here is John's crayon"));
          System.out.println(containsA.or(containsB).test("here is John's pencil"));
      }
  }
輸出是:
真真真假

默認謂詞否定()

negate()方法用於收集所有不符合預定義條件的值。示例:如果您想對“西紅柿”類進行排序並找到所有不是“紅色”的條目,您可以編寫一個謂詞并快速掃描整個序列。嘗試自己編寫此代碼,並在完成後根據解決方案進行檢查。

import java.util.function.Predicate;

public class PredicateDemo3 {
public static void main(String[] args) {
 Predicate<Integer> adult = i -> i >= 18;
System.out.println(adult.negate().test(7));  System.out.println(adult.negate().test(19))
  }
   }
輸出是:
真假

靜態謂詞 isEqual(Object targetRef)

如果您想確定兩個對像是否等於定義為 Objects.equals() 參數的值,此方法非常有用。如果您需要比較相似的測試結果,此方法特別有用。示例:假設您正在比較兩車梨,並想確定兩者的果實重量和顏色是否相同。在這種情況下,static Predicate isEqual(Object targetRef)正是您需要的方法。我們來看看isEqual如何檢查兩個字符串是否相等:

import java.util.function.Predicate;

public class PredicateDemo2 {
   public static void main(String[] args) {
       Predicate<String> i = Predicate.isEqual("here is my crayon");
       System.out.println(i.test("here is my pencil"));
       System.out.println(i.test("here is my crayon"));
   }
}
如果您正在分析的對象符合標準條件,則該函數將返回 true。輸出是:
假 真

Java IntPredicate

Java IntPredicate 是一個函數式接口,因此您可以將它用作 lambda 表達式或方法引用的賦值目標。IntPredicate 對整數進行運算並根據條件返回謂詞值。比如 Predicate Interface,IntPredicate 也有test() , and() , negate() , or()方法。這是 IntPredicate 的示例。它還從數組中過濾所有成人(18 歲或以上)。

import java.util.Arrays;
import java.util.function.IntPredicate;

public class IntPredicateExample {

   public static void main(String[] args) {

       int[] ages = { 18, 28, 18, 46, 90, 45, 2, 3, 1, 5, 7, 21, 12 };

       IntPredicate p = n -> n >= 18;

       Arrays.stream(ages).filter(p).forEach(System.out::println);
   }
}
輸出是:
18 28 18 46 90 45 21

用 Java 編寫乾淨的謂詞

Java 謂詞功能強大且使用起來很有趣。但是,除非您注意編寫的 lambda 表達式如何影響代碼,否則存在使用混亂的謂詞降低代碼可維護性的風險。這裡有一些簡單的做法,可以幫助您確保您的功能界面易於管理和閱讀。
  • 不要重複自己 — 不要用 Java 多次使用重複的值、方法和條件來組合謂詞。這樣,您會浪費生產時間並使代碼變得混亂。
  • 將謂詞與應用程序代碼分開以確保可測試性。除此之外,創建一個謂詞單元測試計劃並堅持下去。
  • 使用導入和組合模式來確保您的類不會臃腫並且易於管理。
  • 考慮將 Java 謂詞移動到 Helper 類——這樣,您可以提高代碼的可重用性並便於維護。
  • 可讀性——只要有可能,更喜歡單行語句而不是複雜的謂詞。炫耀您對複雜功能接口的理解可能很誘人。但是,在維護方面,少即是多。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION