Predicate详解

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

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

//获取所有带UUID注解的属性

Set 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是否满足要求,可以理解为 条件A

*/

boolean test(T t);

/**

* 调用当前Predicate的test方法之后再去调用other的test方法,相当于进行两次判断

* 可理解为 条件A && 条件B

*/

default Predicate and(Predicate super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) && other.test(t);

}

/**

* 对当前判断进行"!"操作,即取非操作,可理解为 ! 条件A

*/

default Predicate negate() {

return (t) -> !test(t);

}

/**

* 对当前判断进行"||"操作,即取或操作,可以理解为 条件A ||条件B

*/

default Predicate or(Predicate super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) || other.test(t);

}

/**

* 对当前操作进行"="操作,即取等操作,可以理解为 A == B

*/

static Predicate isEqual(Object targetRef) {

return (null == targetRef)

? Objects::isNull

: object -> targetRef.equals(object);

}

}

2、常规示例

public static void main(String[] args) {

/**

* 1、判断数字是否大于7

*/

//设置一个大于7的过滤条件

Predicate 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 list = Lists.newArrayList(user1, user2, user3);

/**

* 1、获取年龄大于2的对象

*/

List collect = list.stream().filter(x -> x.getAge() > 2).collect(Collectors.toList());

System.out.println("获取年龄大于2的数量 = " + collect.size());

//输出:获取年龄大于2的数量 = 1

/**

* 2、去重 设置name相同即为相同对象

*/

//方式1直接使用 distinct

List 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 predicate = Predicate.isEqual(user4);

List 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使用的。

作用

处理集合的过滤条件

反射工具类的过滤条件

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

1、接口源码

@GwtCompatible

public interface Predicate {

//重写过滤条件

@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 list = Lists.newArrayList(person1, person2, person3);

/**

* 1、guava使用过滤 年龄大于2的

*/

Predicate predicate1 = new Predicate() {

//重写两个方法

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

predicate java_java代码之美(13)--- Predicate详解相关推荐

  1. SF图像滤镜/美颜/美妆算法详解与实战

    本专栏将结合本热多年相关经验,从传统算法到火热的AI算法,给大家详细讲解目前在PC图像软件.手机图像处理类应用app,以及视频直播等应用类型中,图像视频的滤镜特效,人像美颜美妆特效的算法理论,并结合具 ...

  2. java request获取域,Java Web - Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(二)...

    Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据.请求分派.请求域)(2) HttpServletRequest ----------------- ...

  3. 安卓java安装apk代码_Android 通过代码安装 APK的方法详解

    在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越 ...

  4. 龙族幻想冰龙古洞计算机指令,龙族幻想挑战代码指令及电脑位置详解 龙族幻想代号末日卡木头人bug...

    龙族幻想挑战代码指令及电脑位置详解 龙族幻想代号末日卡木头人bug由西皮资源网编辑网络收集整理,本文立场不代表本站立场,仅供学习参考.版权和权益都归属于作者,如有侵害您的权益请与本站联系,我们将在第一 ...

  5. predicate java 作用_Java函数式编程接口详解之Predicate

    一.初识 Predicate是Java提供的重要的函数编程接口之一,作用主要是用于逻辑判断. 首先看看源码: @FunctionalInterface public interface Predica ...

  6. git 代码回滚 reset revert 详解 IDEA操作 4种reset区别

    问题描述: 我们用 git 在单人或者多人开发的时候,有时候出现的 错误的提交 ,我们此时 撤销 之前的操作,回退.回滚 到之前的版本,这里总结了 2种方法:reset(删除错误提交) 和 rever ...

  7. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  8. 【小白学PyTorch】13.EfficientNet详解及PyTorch实现

    <<小白学PyTorch>> 小白学PyTorch | 12 SENet详解及PyTorch实现 小白学PyTorch | 11 MobileNet详解及PyTorch实现 小 ...

  9. php面向对象代码_PHP面向对象之抽象类详解(代码实例)

    [摘要] PHP即"超文本预处理器",是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...

最新文章

  1. Apache源码包在LINUX(CENTOS6.8)中的安装(出现问题及解决)
  2. Spring.NET学习笔记9——打造简易的依赖注入框架(练习篇) Level 100
  3. dubbo在idea下的使用创建 服务者,消费者 注册中心
  4. 1.VMware安装3个ubuntu14.05
  5. SFB 项目经验-05-共存迁移-Lync 2013-SFB 2015-边缘服务器复制状态不正常
  6. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
  7. 动态规划之背包问题(C语言)
  8. 预训练 | 2022年 预训练的下一步是什么?
  9. ps4手柄驱动linux,GeForce 344.11正式版驱动:支持GTX 980/970,集成DSR选项
  10. CentOS7.6重装系统步骤
  11. 计算机报名登录老显示验证码错误是怎么回事,为何登录博客时输入了正确的验证码却总提示验证码错误?...
  12. 源支付5.18源码/三网免挂/带云端/附源码搭建教程
  13. selenium必应搜索,获取标题以及url
  14. 解决百度网盘限速的软件
  15. 【智能制造】生产异常情况的处理流程
  16. 含有js的英文单词_js-组成-dom-常见单词
  17. 源于日本的工作之道“守破离”是个学习路径的好方法
  18. Postgresql事务隔离界别的总结
  19. MySql——忘记密码怎么办
  20. 猪齿鱼V2.1.0 发布 移动办公、知识在线协作, 项目管理快人一步

热门文章

  1. linux 中文乱码问题的解决方法
  2. git reset --hard、git reset --sort及git revert区别
  3. 如何正确使用Git Flow 流程
  4. intellij idea 1314 插件推荐及快速上手建议
  5. Java 内存模型及GC原理
  6. 卷积Groups Group Convolutions
  7. 支持向量机(三)核函数
  8. Docker 网络之进阶篇
  9. Tomcat一些小事
  10. es6学习笔记-module_v1.0_byKL