Predicate 翻譯成中文是謂語的意思,那麼謂語是對主語動作或狀态的陳述或說明,指出“做什麼”do what,“是什麼”what is this或是“怎麼樣”how ‘’
它代表隻有一個變量的函數,傳回 boolean 類型。
有時候我們需要進行各種判斷,進而得到一個 boolean 值的結果。
首先我們來看一下Predicate中的方法:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLyklaNRTRq5UNNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0QTN3UjN1QTM5IDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我們首先來看一下test方法:
/**
* 根據給定的參數計算此謂語
*
* @param t 輸入參數
* @return {@code true} 如果輸入參數與謂語比對則傳回true
* otherwise {@code false} 否則傳回false
*/
boolean test(T t);
簡單的說明一下使用:
Predicate<String> zfc=t->t.equals("你好");
boolean test = zfc.test("你好");
System.out.println(test); //傳回結果true
我們再來看一下and方法:
/**
* 傳回表示此謂詞和另一個謂詞的短路邏輯與的複合謂詞。
* 在判斷組合謂詞時,如果此謂詞為{@code false},
* 則不判斷{@code other}其他謂詞
*
* <p>在評估任一謂詞期間抛出的任何異常都會轉發給調用者;
* 如果對此謂詞的判斷引發異常,則不會計算{@code other}其他謂詞。
*
* @param 其他謂詞将與此謂詞進行邏輯AND運算
*
* @return 一個組合謂詞,表示該謂詞和{@code other}謂詞的短路邏輯和
* @throws 如果其他謂詞為空,則抛出空指針異常
*/
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
簡單使用範例:
String a1=“hello”;
Predicate<String> containsh=t->t.contains("h");
Predicate<String> containse=t->t.contains("e");
System.out.println("a1中是否包含:"+containsh.and(containse).test(a1)); //傳回true 邏輯與的關系 h和e都包含
看完邏輯與之後我們來看 或的方法:
/**
* 傳回一個組合謂詞,表示此謂詞與另一個謂詞的短路邏輯OR。
* 在判斷組合謂詞時,如果此謂詞為{@code true},則不會判斷{@code other}謂詞
*
* <p>在評估任一謂詞期間抛出的任何異常都會轉發給調用者;
* 如果對此謂詞的評估引發異常,則不會評估{@code other}謂詞。
*
* @param other謂詞将與此謂詞進行邏輯或運算
* @return 一個組合謂詞,表示該謂詞和{@code other}謂詞的短路邏輯OR
* @throws 如果other為null則抛出空指針異常
*/
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
簡單使用範例:
其實跟and差不多,隻不過條件不一樣
String a1="hello";
Predicate<String> containsh=t->t.contains("h");
Predicate<String> containse=t->t.contains("s");
System.out.println("a1中是否包含:"+containsh.and(containse).test(a1)); //傳回true 邏輯或的關系 隻包含其中一個就傳回true
我們看完邏輯或,再來看非的源碼:
/**
* 傳回表示此謂詞的邏輯否定的謂詞。
* @return 表示此謂詞的邏輯否定的謂詞
*/
default Predicate<T> negate() {
return (t) -> !test(t);
}
簡單使用範例:
String a1="hello";
Predicate<String> containsh=t->t.contains("h");
Predicate<String> containse=t->t.contains("e");
System.out.println("a1中是否包含:"+containsh.negate().test(a1)); //傳回false hello中包含h,取反傳回false。
看完與、或、非我們來看改函數接口最後一個方法isEqual,用于比較相等的對象引用
/**
* 傳回一個謂詞,根據{@link Objects#equals(Object,Object)}測試兩個參數是否相等。
*
* @param <T>謂詞的參數類型
* @param targetRef用于比較相等性的對象引用,可以是{@code null}
* @return 根據{@link Objects#equals(Object,Object)}測試兩個參數是否相等的謂詞
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
簡單使用範例:
String a1="String";
Predicate<String> object=Predicate.isEqual("String");
System.out.println(object.test(a1));
Predicate在條件判斷結合lambada表達式非常簡潔迅速,語義清晰明了,可讀性強。