欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Predicate接口源碼使用示例

 更新時間:2025年04月09日 10:00:48   作者:千瞱  
Java8引入了許多函數(shù)式接口(Functional Interface),Predicate(斷言)就是其中一個,它的主要作用可以簡單描述為:向其傳入一個對象(可以理解為參數(shù)),將得到一個布爾值作為輸出,這篇文章主要介紹了Java Predicate接口源碼使用示例,需要的朋友可以參考下

Java8引入了許多函數(shù)式接口(Functional Interface),Predicate(斷言)就是其中一個,它的主要作用可以簡單描述為:向其傳入一個對象(可以理解為參數(shù)),將得到一個布爾值作為輸出。

接口源碼

Predicate接口的源碼非常簡單,如下所示,重點內容有:

所有的函數(shù)式接口都帶有@FunctionalInterface標明其身份;test()方法用來處理輸入的參數(shù)t,計算得到輸出結果為true還是false;and(), negate(), or()函數(shù)功能類似與或非,能夠進行串聯(lián);

@FunctionalInterface
public interface Predicate<T> {
    /**
     * 具體過濾操作 需要被子類實現(xiàn).
     * 用來處理參數(shù)T是否滿足要求,可以理解為 條件A
     */
    boolean test(T t);
    /**
     * 調用當前Predicate的test方法之后再去調用other的test方法,相當于進行兩次判斷
     * 可理解為 條件A && 條件B
     */
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
    /**
     * 對當前判斷進行"!"操作,即取非操作,可理解為 ! 條件A
     */
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
    /**
     * 對當前判斷進行"||"操作,即取或操作,可以理解為 條件A ||條件B
     */
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    /**
     * 對當前操作進行"="操作,即取等操作,可以理解為 A == B
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

使用舉例

看了上面的接口源碼,你可能還是一知半解,這是一個接口,到底要怎么使用呢?看如下例子:

// 將實現(xiàn)用戶名校驗規(guī)則的lambda函數(shù)賦給Predicate實例
Predicate<String> isUserNameValid = u -> u != null && u.length() > 5 && u.length() < 10;
// 調用test方法,test方法的參數(shù)就是待檢測的字符串(也就是喂給Predicate實例的數(shù)據(jù)),將會輸出true
System.out.println(isUserNameValid.test("Howard"));
// 同樣的道理
Predicate<String> isPasswordValid = p -> p != null && p.length() > 8 && p.length() < 15;
System.out.println(isPasswordValid.test("123456789"));

另外,在Java8的stream里面也有很多Predicate的應用,如filter函數(shù)的參數(shù)就是Predicate:

Arrays.asList("A1234567890", "Howard", "Tommy", "Jone").stream()
     .filter(str -> str.length() > 5)
     .filter(str -> str.length() < 10)
     .collect(Collectors.toList());

函數(shù)文檔為:

java.util.stream.Stream<T>
public abstract Stream<T> filter(java.util.function.Predicate<? super T> predicate)

進階舉例

除了像上面這樣定義單個的Predicate,也可以利用其and()等函數(shù),將多個語句串聯(lián)起來:

Predicate<String> predicate1 = str -> str.startsWith("A");
Predicate<String> predicate2 = str -> str.length() > 5;
Predicate<String> predicate3 = str -> str.length() < 10;
predicate1.and(predicate2).and(predicate3).test("A12347");  // true

除此之外,還可以對Predicate進行封裝,構建Fluent API風格的校驗器:

public class Validator<T> {
    private Predicate<T> predicate;
    public Validator() {
    	// 將predicate初始化為true
        this.predicate = t -> true;
    }
	// 添加校驗策略,由于該函數(shù)返回this,因此可以無限使用and串聯(lián)
    public Validator<T> with(Predicate<T> predicate) {
        this.predicate = this.predicate.and(predicate);
        return this;
    }
	// 執(zhí)行校驗,并返回校驗結果
    public boolean validate(T t) {
        return this.predicate.test(t);
    }
}
public static void main(String[] args) {
    boolean result = new Validator<String>()
        .with(u -> u != null)
        .with(u -> u.length() > 5)
        .with(u -> u.length() < 10)
        .validate("Howard");
    System.out.println(result); // true
}

到此這篇關于Java Predicate接口源碼使用示例的文章就介紹到這了,更多相關Java Predicate內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • AndroidQ沙盒機制之分區(qū)存儲適配

    AndroidQ沙盒機制之分區(qū)存儲適配

    這篇文章主要介紹了AndroidQ沙盒機制之分區(qū)存儲適配,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 在@Value注解內使用SPEL自定義函數(shù)方式

    在@Value注解內使用SPEL自定義函數(shù)方式

    這篇文章主要介紹了在@Value注解內使用SPEL自定義函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java實現(xiàn)點擊按鈕彈出新窗體功能

    java實現(xiàn)點擊按鈕彈出新窗體功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)點擊按鈕彈出新窗體功能,舊窗體不進行操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java中內存溢出和內存泄漏如何解決

    Java中內存溢出和內存泄漏如何解決

    ?內存溢出?和?內存泄漏?是兩種常見的內存管理問題,它們都會對程序的性能產(chǎn)生負面影響,本文主要介紹了Java中的內存溢出和內存泄漏問題解決,感興趣的可以了解一下
    2024-12-12
  • java實現(xiàn)簡單銀行ATM系統(tǒng)

    java實現(xiàn)簡單銀行ATM系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java中Cookie和Session詳解及區(qū)別總結

    Java中Cookie和Session詳解及區(qū)別總結

    這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Java觀察者設計模式(Observable和Observer)

    Java觀察者設計模式(Observable和Observer)

    這篇文章主要介紹了 Java觀察者設計模式(Observable和Observer)的相關資料,需要的朋友可以參考下
    2015-12-12
  • 一文深入解析JDBC超時機制

    一文深入解析JDBC超時機制

    恰當?shù)腏DBC超時設置能夠有效地減少服務失效的時間,下面這篇文章主要給大家介紹了關于JDBC超時機制的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • Java中\(zhòng)n和\r區(qū)別

    Java中\(zhòng)n和\r區(qū)別

    本文主要介紹了Java中\(zhòng)n和\r區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 如何在java 8 stream表達式實現(xiàn)if/else邏輯

    如何在java 8 stream表達式實現(xiàn)if/else邏輯

    這篇文章主要介紹了如何在java 8 stream表達式實現(xiàn)if/else邏輯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論