Java Predicate接口源碼使用示例
Java8引入了許多函數(shù)式接口(Functional Interface),Predicate(斷言)就是其中一個(gè),它的主要作用可以簡單描述為:向其傳入一個(gè)對(duì)象(可以理解為參數(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);
}
/**
* 對(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è)語句串聯(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除此之外,還可以對(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,因此可以無限使用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)文章
AndroidQ沙盒機(jī)制之分區(qū)存儲(chǔ)適配
這篇文章主要介紹了AndroidQ沙盒機(jī)制之分區(qū)存儲(chǔ)適配,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
在@Value注解內(nèi)使用SPEL自定義函數(shù)方式
這篇文章主要介紹了在@Value注解內(nèi)使用SPEL自定義函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
java實(shí)現(xiàn)點(diǎn)擊按鈕彈出新窗體功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)點(diǎn)擊按鈕彈出新窗體功能,舊窗體不進(jìn)行操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
java實(shí)現(xiàn)簡單銀行ATM系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Java中Cookie和Session詳解及區(qū)別總結(jié)
這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06
Java觀察者設(shè)計(jì)模式(Observable和Observer)
這篇文章主要介紹了 Java觀察者設(shè)計(jì)模式(Observable和Observer)的相關(guān)資料,需要的朋友可以參考下2015-12-12
如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯
這篇文章主要介紹了如何在java 8 stream表達(dá)式實(shí)現(xiàn)if/else邏輯,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04

