遇到Predicate
是本身在自定義Mybatis攔截器的時候,在攔截器中咱們是經過反射機制獲取對象的全部屬性,再查看這些屬性上是否有咱們自定義的UUID註解。java
若是有該註解,那麼就給該屬性賦值UUID隨機字符串,做爲主鍵保存到數據庫。因此前提條件就是獲取帶有UUID註解的屬性,就須要用到Predicate。數據庫
//獲取全部帶UUID註解的屬性 Set<Field> allFields = ReflectionUtils.getFields(object.getClass(),x.getAnnotation(UUId.class) != null);
也想到以前本身在用steam處理集合的時候,添加的過濾條件也是用Predicate
,只不過它們不在同一包下。雖然它們不在同一包下但它們的做用是一致的,就是app
Predicate接口主要用來判斷一個參數是否符合要求
ide
下面對這兩個接口分別進行說明並舉例。工具
這裏類是java自帶主要普遍用在支持lambda表達式的API中。測試
@FunctionalInterface public interface Predicate<T> { /** * 具體過濾操做 須要被子類實現. * 用來處理參數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); } }
public static void main(String[] args) { /** * 一、判斷數字是否大於7 */ //設置一個大於7的過濾條件 Predicate<Integer> predicate = x -> x > 7; System.out.println(predicate.test(10)); //輸出 true System.out.println(predicate.test(6)); //輸出 fasle /** * 二、大於7而且 */ //在上面大於7的條件下,添加是偶數的條件 predicate = predicate.and(x -> x % 2 == 0); System.out.println(predicate.test(6)); //輸出 fasle System.out.println(predicate.test(12)); //輸出 true System.out.println(predicate.test(13)); //輸出 fasle /** * 三、add or 簡化寫法 */ predicate = x -> x > 5 && x < 9; System.out.println(predicate.test(10)); //輸出 false System.out.println(predicate.test(6)); //輸出 true }
User對象ui
@Data @AllArgsConstructor @ToString public class User { /** * 姓名 */ private String name; /** * 性別 */ private String sex; /** * 年齡 */ private Integer age; /** * 重寫equals和hashCode */ @Override public boolean equals(Object obj) { if (obj instanceof User) { User user = (User) obj; if (name.equals(user.name)){ return true; } } return false; } @Override public int hashCode () { return name.hashCode(); } }
測試代碼google
public static void main(String[] args) { User user1 = new User("張三", "女", 1); User user2 = new User("李四", "男", 2); User user3 = new User("張三", "女", 3); List<User> list = Lists.newArrayList(user1, user2, user3); /** * 一、獲取年齡大於2的對象 */ List<User> collect = list.stream().filter(x -> x.getAge() > 2).collect(Collectors.toList()); System.out.println("獲取年齡大於2的數量 = " + collect.size()); //輸出:獲取年齡大於2的數量 = 1 /** * 二、去重 設置name相同即爲相同對象 */ //方式1直接使用 distinct List<User> collect1 = list.stream().distinct().collect(Collectors.toList()); System.out.println("輸出剩餘對象" + collect1); //輸出:輸出剩餘對象[User(name=張三, sex=女, age=1), User(name=李四, sex=男, age=2)] /** * 三、從集合找出與該對象相同的元素 一樣name相同即爲相同對象 */ User user4 = new User("張三", "男", 8); Predicate<User> predicate = Predicate.isEqual(user4); List<User> collect2 = list.stream().filter(predicate).collect(Collectors.toList()); System.out.println("與該對象相同的對象有" + collect2); //輸出:與該對象相同的對象有[User(name=張三, sex=女, age=1), User(name=張三, sex=女, age=3)] }
運行結果code
這裏的Predicate是配合guava使用的。對象
做用
若是做爲集合的過濾條件,如今已經沒有必要用它了,由於JDK1.8的stream在處理集合的時候比它好用多了。
@GwtCompatible public interface Predicate<T> { //重寫過濾條件 @CanIgnoreReturnValue boolean apply(@Nullable T input); //重寫equals boolean equals(@Nullable Object object);
在使用它的時候須要重寫兩個方法。
自定義UUID註解
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface UUID { }
Person
@Data @AllArgsConstructor @ToString public class Person { /** * 姓名 在name上使用UUID註解 */ @UUID private String name; /** * 性別 */ private String sex; /** * 年齡 */ private Integer age; }
測試代碼
public static void main(String[] args) { Person person1 = new Person("張三", "女", 1); Person person2 = new Person("李四", "男", 2); Person person3 = new Person("張三", "女", 3); List<Person> list = Lists.newArrayList(person1, person2, person3); /** * 一、guava使用過濾 年齡大於2的 */ Predicate<Person> predicate1 = new Predicate<Person>() { //重寫兩個方法 @Override public boolean apply(Person input) { if (input.getAge() > 2) { return true; } return false; } @Override public boolean equals(Object object) { return true; } }; list = Lists.newArrayList(Iterables.filter(list,predicate1)); System.out.println("過濾後的集合數據: "+list); //輸出: 過濾後的集合數據: [Person(name=張三, sex=女, age=3)] /** * 二、配合反射工具類ReflectionUtils過濾獲取屬性 */ Person person4 = new Person("張三", "女", 1); Set<Field> allFields = org.reflections.ReflectionUtils.getFields(person4.getClass(),x -> x != null && x.getAnnotation(UUID.class) != null); System.out.println("帶UUID註解的屬性有 "+ allFields); //輸出 :帶UUID註解的屬性有 [private java.lang.String com.jincou.vo.Person.name] }
運行結果
很明顯,這裏已經獲取到了帶有UUID註解的屬性爲name。
我相信,不管從此的道路多麼坎坷,只要抓住今天,早晚會在奮鬥中嚐到人生的甘甜。抓住人生中的一分一秒,賽過虛度中的一月一年!(2)