遇到Predicate
是本身在自定义Mybatis拦截器的时候,在拦截器中咱们是经过反射机制获取对象的全部属性,再查看这些属性上是否有咱们自定义的UUID注解。html
若是有该注解,那么就给该属性赋值UUID随机字符串,做为主键保存到数据库。因此前提条件就是获取带有UUID注解的属性,就须要用到Predicate。java
//获取全部带UUID注解的属性 Set<Field> allFields = ReflectionUtils.getFields(object.getClass(),x.getAnnotation(UUId.class) != null);
也想到以前本身在用steam处理集合的时候,添加的过滤条件也是用Predicate
,只不过它们不在同一包下。虽然它们不在同一包下但它们的做用是一致的,就是数据库
Predicate接口主要用来判断一个参数是否符合要求
app
下面对这两个接口分别进行说明并举例。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对象测试
@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(); } }
测试代码ui
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)] }
运行结果google
<br>spa
这里的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。
<br> <br>
我相信,不管从此的道路多么坎坷,只要抓住今天,早晚会在奋斗中尝到人生的甘甜。抓住人生中的一分一秒,赛过虚度中的一月一年!(2)
原文出处:https://www.cnblogs.com/qdhxhz/p/11323595.html