Predicate簡介:
Predicate是一個功能性的接口,其功能是判斷某個參數是否滿足表達式。相似的還有BiPredicate<T, U>(使用 test(T t, U u)方法,判斷參數t、u是否滿足BiPredicate執行個體所代表的表達式);DoublePredicate(對于基本資料類型double的Predicate);LongPredicate(對于基本資料類型int的Predicate);IntPredicate(對于基本資料類型long的Predicate)。
注:本文主要學習Predicate,學會了Predicate,那麼自然就學會了BiPredicate<T, U>、DoublePredicate、
IntPredicate、LongPredicate。
Predicate學習:
- test(T t):判斷t,是否滿足Predicate執行個體所代表的表達式。
/**
* test(T t): 判斷t,是否滿足Predicate執行個體所代表的表達式
*/
@Test
public void test1() {
// 形參x的資料類型,由Predicate<T>的泛型T指定
// 定義一個 用于判斷的表達式(這裡為 x >= 1)
Predicate<Integer> predicate = x -> x >= 1;
// 判斷參數是否滿足 predicate代表的表達式
boolean resultOne = predicate.test(0);
boolean resultTwo = predicate.test(1);
// 輸出結果為: false
System.out.println(resultOne);
// 輸出結果為: true
System.out.println(resultTwo);
}
運作測試類,控制台輸出:
- isEqual(Object targetRef):判斷targetRef,是否與Predicate執行個體所代表的對象相等。
/**
* isEqual(Object targetRef): 判斷targetRef,是否與Predicate執行個體所代表的對象相等
*/
@Test
public void test2() {
/*
* 等價于:
* Predicate<Object> predicate = x -> {
* if (x == objA) {
* return true;
* }
* return x.equals(objA);
* };
*/
Object objA = new Object();
Predicate<Object> predicate = Predicate.isEqual(objA);
// 判斷參數是否滿足 predicate代表的表達式
boolean resultOne = predicate.test(objA);
boolean resultTwo = predicate.test(null);
boolean resultThree = predicate.test(new Object());
// 輸出結果為: true
System.out.println(resultOne);
// 輸出結果為: false
System.out.println(resultTwo);
// 輸出結果為: false
System.out.println(resultThree);
}
運作測試類,控制台輸出:
- and(Predicate<? super T> other):對兩個Predicate執行個體取&&,得到新的Predicate執行個體。
/**
* and(Predicate<? super T> other): 對兩個Predicate執行個體取&&,得到新的Predicate執行個體
*/
@Test
public void test3() {
// 定義兩個 用于判斷的表達式
Predicate<Integer> predicateOne = x -> x >= 1;
Predicate<Integer> predicateTwo = x -> x <= 2;
/*
* 對兩個表達式取 &&
*
* 等價于:Predicate<Integer> predicateThree = x -> x >= 1 && x <= 2;
*/
Predicate<Integer> predicateThree = predicateOne.and(predicateTwo);
// 判斷參數是否滿足 predicateThree代表的表達式
boolean resultOne = predicateThree.test(0);
boolean resultTwo = predicateThree.test(1);
boolean resultThree = predicateThree.test(2);
boolean resultFour = predicateThree.test(3);
// 輸出結果為: false
System.out.println(resultOne);
// 輸出結果為: true
System.out.println(resultTwo);
// 輸出結果為: true
System.out.println(resultThree);
// 輸出結果為: false
System.out.println(resultFour);
}
運作測試類,控制台輸出:
- or(Predicate<? super T> other):對兩個Predicate執行個體取||,得到新的Predicate執行個體。
/**
* or(Predicate<? super T> other): 對兩個Predicate執行個體取||,得到新的Predicate執行個體
*/
@Test
public void test4() {
// 定義兩個 用于判斷的表達式
Predicate<Integer> predicateOne = x -> x >= 1;
Predicate<Integer> predicateTwo = x -> x <= -1;
/*
* 對兩個表達式取 ||
*
* 等價于:Predicate<Integer> predicateThree = x -> x >= 1 || x <= -1;
*/
Predicate<Integer> predicateThree = predicateOne.or(predicateTwo);
// 判斷參數是否滿足 predicateThree代表的表達式
boolean resultOne = predicateThree.test(-2);
boolean resultTwo = predicateThree.test(-1);
boolean resultThree = predicateThree.test(0);
boolean resultFour = predicateThree.test(1);
boolean resultFive = predicateThree.test(2);
// 輸出結果為: true
System.out.println(resultOne);
// 輸出結果為: true
System.out.println(resultTwo);
// 輸出結果為: false
System.out.println(resultThree);
// 輸出結果為: true
System.out.println(resultFour);
// 輸出結果為: true
System.out.println(resultFive);
}
運作測試類,控制台輸出:
- negate():對目前Predicate執行個體取!,得到新的Predicate執行個體。
/**
* negate(): 對目前Predicate執行個體取!,得到新的Predicate執行個體
*/
@Test
public void test5() {
// 定義兩個 用于判斷的表達式
Predicate<Integer> predicateOne = x -> x >= 1;
/*
* 等價于:Predicate<Integer> predicate = x -> !(x >= 1);
* 等價于:Predicate<Integer> predicate = x -> x < 1;
*/
Predicate<Integer> predicate = predicateOne.negate();
// 判斷參數是否滿足 predicateThree代表的表達式
boolean resultOne = predicate.test(0);
boolean resultTwo = predicate.test(1);
boolean resultThree = predicate.test(2);
// 輸出結果為: true
System.out.println(resultOne);
// 輸出結果為: false
System.out.println(resultTwo);
// 輸出結果為: false
System.out.println(resultThree);
}
運作測試類,控制台輸出:
Predicate學習完畢!
^_^ 如有不當之處,歡迎指正
^_^ 參考連結
https://www.jianshu.com/p/b38ff80e3039
^_^ 參考文檔
《jdk api 1.8_google.CHM》
^_^ 測試代碼托管連結
https://github.com/JustryDeng…Jdk8Feature