最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Predicate接口源碼使用示例

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

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

接口源碼

Predicate接口的源碼非常簡單,如下所示,重點(diǎn)內(nèi)容有:

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

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

使用舉例

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

// 將實(shí)現(xiàn)用戶名校驗(yàn)規(guī)則的lambda函數(shù)賦給Predicate實(shí)例
Predicate<String> isUserNameValid = u -> u != null && u.length() > 5 && u.length() < 10;
// 調(diào)用test方法,test方法的參數(shù)就是待檢測的字符串(也就是喂給Predicate實(shí)例的數(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的應(yīng)用,如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)

進(jìn)階舉例

除了像上面這樣定義單個(gè)的Predicate,也可以利用其and()等函數(shù),將多個(gè)語句串聯(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進(jìn)行封裝,構(gòu)建Fluent API風(fēng)格的校驗(yàn)器:

public class Validator<T> {
    private Predicate<T> predicate;
    public Validator() {
    	// 將predicate初始化為true
        this.predicate = t -> true;
    }
	// 添加校驗(yàn)策略,由于該函數(shù)返回this,因此可以無限使用and串聯(lián)
    public Validator<T> with(Predicate<T> predicate) {
        this.predicate = this.predicate.and(predicate);
        return this;
    }
	// 執(zhí)行校驗(yàn),并返回校驗(yàn)結(jié)果
    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
}

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

相關(guān)文章

  • Java常用注解擴(kuò)展對比舉例詳解

    Java常用注解擴(kuò)展對比舉例詳解

    這篇文章主要介紹了Java常用注解擴(kuò)展對比的相關(guān)資料,提供了豐富的代碼示例,并總結(jié)了最佳實(shí)踐建議,幫助開發(fā)者更好地理解和應(yīng)用這些注解,需要的朋友可以參考下
    2025-03-03
  • Java通過PropertyDescriptor反射調(diào)用set和get方法

    Java通過PropertyDescriptor反射調(diào)用set和get方法

    這篇文章主要為大家詳細(xì)介紹了Java通過PropertyDescriptor反射調(diào)用set和get方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Redis 訂閱發(fā)布_Jedis實(shí)現(xiàn)方法

    Redis 訂閱發(fā)布_Jedis實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猂edis 訂閱發(fā)布_Jedis實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • IDEA找不到database圖標(biāo)的簡單圖文解決方法

    IDEA找不到database圖標(biāo)的簡單圖文解決方法

    idea是一個(gè)功能十分強(qiáng)大的IDE,大家在使用他進(jìn)行開發(fā)時(shí)候,必不可少的就是連接數(shù)據(jù)庫了,這篇文章主要給大家介紹了關(guān)于IDEA找不到database圖標(biāo)的解決方法,需要的朋友可以參考下
    2024-07-07
  • Java查找并高亮PDF文本過程解析

    Java查找并高亮PDF文本過程解析

    這篇文章主要介紹了Java查找并高亮PDF文本過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Hibernate初體驗(yàn)及簡單錯(cuò)誤排除代碼詳解

    Hibernate初體驗(yàn)及簡單錯(cuò)誤排除代碼詳解

    這篇文章主要介紹了Hibernate初體驗(yàn)及簡單錯(cuò)誤排除代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java 對數(shù)和指數(shù)計(jì)算方式

    java 對數(shù)和指數(shù)計(jì)算方式

    這篇文章主要介紹了java 對數(shù)和指數(shù)計(jì)算方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • springboot?vue接口測試定義編輯功能的實(shí)現(xiàn)

    springboot?vue接口測試定義編輯功能的實(shí)現(xiàn)

    這篇文章主要為大家介紹了springboot?vue接口測試定義編輯功能的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • RabbitMQ工作模式中的RPC通信模式詳解

    RabbitMQ工作模式中的RPC通信模式詳解

    在RabbitMQ中,RPC模式通過消息隊(duì)列實(shí)現(xiàn)遠(yuǎn)程調(diào)用功能,這篇文章給大家介紹RabbitMQ工作模式之RPC通信模式,感興趣的朋友一起看看吧
    2025-06-06
  • idea為java程序添加啟動(dòng)參數(shù)的問題解析(program?arguments,vm?arguments,Environment?variable)并在程序中獲取使用

    idea為java程序添加啟動(dòng)參數(shù)的問題解析(program?arguments,vm?arguments,Envi

    這篇文章主要介紹了idea為java程序添加啟動(dòng)參數(shù)的問題解析(program?arguments,vm?arguments,Environment?variable)并在程序中獲取使用,本文給大家分享問題描述及解決方法,需要的朋友可以參考下
    2023-09-09

最新評論

扶余县| 绿春县| 浙江省| 柯坪县| 阳城县| 泽州县| 清苑县| 酉阳| 隆尧县| 绥中县| 高阳县| 神木县| 观塘区| 临夏县| 尼勒克县| 宣武区| 兰州市| 西宁市| 常德市| 霍邱县| 昔阳县| 梧州市| 瑞昌市| 额济纳旗| 精河县| 汶川县| 巴彦淖尔市| 临漳县| 罗定市| 三河市| 长宁县| 深州市| 襄城县| 泽库县| 义乌市| 雷山县| 婺源县| 习水县| 阜宁县| 垫江县| 邯郸县|