天天看點

java中lambada表達式中的Predicate

Predicate 翻譯成中文是謂語的意思,那麼謂語是對主語動作或狀态的陳述或說明,指出“做什麼”do what,“是什麼”what is this或是“怎麼樣”how ‘’

它代表隻有一個變量的函數,傳回 boolean 類型。​

有時候我們需要進行各種判斷,進而得到一個 boolean 值的結果。

首先我們來看一下Predicate中的方法:

java中lambada表達式中的Predicate

我們首先來看一下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表達式非常簡潔迅速,語義清晰明了,可讀性強。

繼續閱讀