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

Java Predicate接口源碼使用示例

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

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

接口源碼

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

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

@FunctionalInterface
public interface Predicate<T> {
    /**
     * 具體過(guò)濾操作 需要被子類(lèi)實(shí)現(xiàn).
     * 用來(lái)處理參數(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);
    }
    /**
     * 對(duì)當(dāng)前判斷進(jìn)行"!"操作,即取非操作,可理解為 ! 條件A
     */
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }
    /**
     * 對(duì)當(dāng)前判斷進(jìn)行"||"操作,即取或操作,可以理解為 條件A ||條件B
     */
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
    /**
     * 對(duì)當(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ù)就是待檢測(cè)的字符串(也就是喂給Predicate實(shí)例的數(shù)據(jù)),將會(huì)輸出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è)語(yǔ)句串聯(lián)起來(lái):

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

除此之外,還可以對(duì)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,因此可以無(wú)限使用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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

修文县| 南江县| 清水河县| 梁河县| 阜康市| 临沂市| 洪洞县| 高雄市| 尉犁县| 盘锦市| 浮山县| 沙雅县| 昔阳县| 乐都县| 綦江县| 厦门市| 游戏| 格尔木市| 岚皋县| 永昌县| 梁山县| 城步| 定襄县| 西安市| 武陟县| 车致| 宁津县| 乐清市| 改则县| 庆阳市| 枞阳县| 泸定县| 喀喇| 颍上县| 禄丰县| 呼伦贝尔市| 甘南县| 隆昌县| 芮城县| 桐城市| 江油市|