Predicate详解

遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,再查看这些属性上是否有我们自定义的UUID注解

如果有该注解,那么就给该属性赋值UUID随机字符串,作为主键保存到数据库。所以前提条件就是获取带有UUID注解的属性,就需要用到Predicate。

//获取所有带UUID注解的属性
Set<Field> allFields = ReflectionUtils.getFields(object.getClass(),x.getAnnotation(UUId.class) != null);

也想到之前自己在用steam处理集合的时候,添加的过滤条件也是用Predicate,只不过它们不在同一包下。虽然它们不在同一包下但它们的作用是一致的,就是

Predicate接口主要用来判断一个参数是否符合要求

下面对这两个接口分别进行说明并举例。

一、java.util.function.Predicate

这里类是java自带主要广泛用在支持lambda表达式的API中。

1、接口源码

@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);
}
}

2、常规示例

    public static void main(String[] args) {
/**
* 1、判断数字是否大于7
*/
//设置一个大于7的过滤条件
Predicate<Integer> predicate = x -> x > 7;
System.out.println(predicate.test(10)); //输出 true
System.out.println(predicate.test(6)); //输出 fasle
/**
* 2、大于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
/**
* 3、add or 简化写法
*/
predicate = x -> x > 5 && x < 9;
System.out.println(predicate.test(10)); //输出 false
System.out.println(predicate.test(6)); //输出 true
}

3、集合Stream示例

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();
} }

测试代码

    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); /**
* 1、获取年龄大于2的对象
*/
List<User> collect = list.stream().filter(x -> x.getAge() > 2).collect(Collectors.toList());
System.out.println("获取年龄大于2的数量 = " + collect.size());
//输出:获取年龄大于2的数量 = 1 /**
* 2、去重 设置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)] /**
* 3、从集合找出与该对象相同的元素 同样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)]
}

运行结果

二、com.google.common.base.Predicate

这里的Predicate是配合guava使用的。

作用

  1. 处理集合的过滤条件
  2. 反射工具类的过滤条件

如果作为集合的过滤条件,现在已经没有必要用它了,因为JDK1.8的stream在处理集合的时候比它好用多了。

1、接口源码

@GwtCompatible
public interface Predicate<T> {
//重写过滤条件
@CanIgnoreReturnValue
boolean apply(@Nullable T input);
//重写equals
boolean equals(@Nullable Object object);

在使用它的时候需要重写两个方法。

2、示例

自定义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);
/**
* 1、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)] /**
* 2、配合反射工具类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)

java代码之美(13)--- Predicate详解的更多相关文章

  1. Java容器解析系列(13) WeakHashMap详解

    关于WeakHashMap其实没有太多可说的,其与HashMap大致相同,区别就在于: 对每个key的引用方式为弱引用; 关于java4种引用方式,参考java Reference 网上很多说 弱引用 ...

  2. java代码(13) ---Predicate详解

    Predicate详解 遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,在查看这些属性上是否有我们自定义的UUID注解 如果有该注解,那 ...

  3. java代码之美(15)---Java8 Function、Consumer、Supplier

    Java8 Function.Consumer.Supplier 有关JDK8新特性之前写了三篇博客: 1.java代码之美(1)---Java8 Lambda 2.java代码之美(2)---Jav ...

  4. Java学习-007-Log4J 日志记录配置文件详解及实例源代码

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

  5. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

  6. 牛客网 Java 工程师能力评估 20 题 - 详解

    牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...

  7. Java 中的异常和处理详解

    Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...

  8. JAVA JDK 环境变量配置 入门详解 - 精简归纳

    JAVA JDK 环境变量配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 13 转载请注明出处!️ 目录 JAVA JDK 环境变量配置 入门详解 - 精简归纳 一.为什么j ...

  9. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

随机推荐

  1. kafka迁移topic

    1. 准备移动 这里假设要移动的topic名称为:topicA.topicB vim topics-to-move.json {"topics": [{"topic&qu ...

  2. 5分钟快速部署DataDraw数字绘

    经常有小伙伴问,有没有一款好用又免费的画图软件,画画流程图.UML.思维导图?今天就介绍一款开源的在线画图软件,满足各方面人的需求. DataDraw数字绘是一个在线线框图.流程图.网络图.组织结构图 ...

  3. Jpa 笔记

    ORM 思想 对象关系映射, 建立实体类和表的关系映射关系, 实体类和表中字段的映射关系,我们操作实体类底层是操作数据表, 进而自动的拼接出SQL语句 Jpa规范 Jpa(Java Persisten ...

  4. 如何实现LRU算法?

    1.什么是LRU算法? LRU是一种缓存淘汰机制策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新的内容腾位置.但是要删除哪些内容呢?我们肯定希望删掉那些没有用的缓存,而把有用的数据继续 ...

  5. spring的context:exclude-filter 与 context:include-filter

    1 在主容器中(applicationContext.xml),将Controller的注解打消掉 <context:component-scan base-package="com& ...

  6. 28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程> 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程. 考虑到微信公众 ...

  7. 跟我学SpringCloud | 终篇:文章汇总(持续更新)

    SpringCloud系列教程 | 终篇:文章汇总(持续更新) 我为什么这些文章?一是巩固自己的知识,二是希望有更加开放和与人分享的心态,三是接受各位大神的批评指教,有任何问题可以联系我: inwsy ...

  8. 1.为什么会有Servlet?它解决了什么问题?

    1. 为什么会出现Servlet? 因为web服务器(tomcat.Weblogic.iis.apache)没有处理动态资源请求的能力(即该请求需要计算),只能处理静态资源的请求(如果浏览器请求某个h ...

  9. windows7(win7)64/32位激活工具

    win7激活工具中文绿色免费版是改自binbin的作品,我们修改的windows7激活工具grldr模拟激活是别人的东西,能激活win7旗舰.原作者是binbin,其他的激活工具都是基于grldr模拟 ...

  10. Spring Boot + Elasticsearch 实现索引批量写入

    在使用Eleasticsearch进行索引维护的过程中,如果你的应用场景需要频繁的大批量的索引写入,再使用上篇中提到的维护方法的话显然效率是低下的,此时推荐使用bulkIndex来提升效率.批写入数据 ...