天天看點

Java8之Predicate

函數式接口-----Predicate

之前的一篇文章,我分析了函數式接口------Function,現在我們繼續分析第二個函數式接口------Predicate。這是一個斷言式的函數式接口,傳回的是一個boolean值,用于進行判斷行為與參數是否相符。Java8Stream中的filter使用的就是此函數式接口。

下面我将分别列舉出它所包含的方法和使用例子。

第一個方法 ------- test

源碼:

// 用來判斷傳過來的參數是否符合規則
boolean test(T t);
           

示例代碼:

// 将行為傳進去,判斷參數是否符合行為。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<String> predicate = p -> p.length() > 5;
System.out.println(predicate.test("hello"));
           
第二個方法 -------- and(預設方法)

源碼:

// 通過代碼分析,可以看出,and方法進行的是與操作,
// 也就是将調用者的test方法輸出的結果與參數的test方法的結果進行與操作,隻有同時滿足時,才輸出結果。
default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
           

示例代碼:

// 輸出的結果是6,8,10;
// 既滿足第一個行為,也滿足第二個行為,這就是and的用法
predicateTest2.conditionFilter2(list, item -> item > 5, item -> item % 2 == 0);

public void conditionFilter2(List<Integer> list, Predicate<Integer> predicate1, Predicate<Integer> predicate2) {
        for (Integer in : list) {
            if (predicate1.and(predicate2).test(in)) {
                System.out.println(in);
            }
        }
    }
           
第三個方法 ------- negate(預設方法)

源碼:

// 通過代碼分析,可以看出,negate方法進行的是非操作,
// 也就是将調用者的test方法輸出的結果與參數的test方法的結果進行非操作,取得相反的結果。
default Predicate<T> negate() {
        return (t) -> !test(t);
    }
           

示例代碼:

// 輸出的結果是1,2,3,4,5,7,9;
// 值得注意的是,negate是對predicate.and(predicate2)傳回的結果進行操作的,
// 過濾的是list中的符合條件的元素。
 predicateTest2.conditionFilter2(list, item -> item % 2 == 0, item -> item > 5);

 for (Integer in: list) {
    if (predicate.and(predicate2).negate().test(in)) {
        System.out.println(in);
    }
}
           
第四個方法 ------- or(預設方法)

源碼:

// 顧名思義,or代表的就是或,即滿足一個條件即可。
default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
           

示例代碼:

// 輸出的結果: 2,4,6,7,8,9,10;
// 滿足一個條件即可
 predicateTest2.conditionFilter2(list, item -> item % 2 == 0, item -> item > 5);

for (Integer in: list) {
            if (predicate.or(predicate2).test(in)) {
                System.out.println(in);
            }
        }
           
第五個方法 ------- isEqual(靜态方法)

源碼:

// static---靜态方法
// 判斷兩個參數是不是相等的,
// 傳回的Predicate的test方法是用來判斷傳入的參數是否等于targetRef
static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
           

示例代碼:

// 輸出結果是:true
// 将predicateTest2.isEqual("test")中的test與
// predicateTest2.isEqual("test")傳回的predicate
// 的test方法的參數進行比較
System.out.println(predicateTest2.isEqual("test").test("test" ));

public Predicate<String> isEqual(Object object) {
        return Predicate.isEqual(object);
    }