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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中Cookie和Session詳解及區(qū)別總結
這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06Java觀察者設計模式(Observable和Observer)
這篇文章主要介紹了 Java觀察者設計模式(Observable和Observer)的相關資料,需要的朋友可以參考下2015-12-12如何在java 8 stream表達式實現(xiàn)if/else邏輯
這篇文章主要介紹了如何在java 8 stream表達式實現(xiàn)if/else邏輯,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04