java代码之美(13)--- Predicate详解
java代码之美(13)--- 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<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使用的。
作用
处理集合的过滤条件
反射工具类的过滤条件
如果作为集合的过滤条件,现在已经没有必要用它了,因为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<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。
只要自己变优秀了,其他的事情才会跟着好起来(上将12)
原文地址https://www.cnblogs.com/qdhxhz/p/11323595.html
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python老司机:给入门Python的小白支几招,简单粗暴
短时间掌握一门技能是现在社会的需求。节奏越来越快,现在不是大鱼吃小鱼,而是快鱼吃慢鱼的时代。人的时间比机器的时间值钱,而机器可以堆!那么Python作为最简单高效的语言,我们就必须掌握它, 那么今天就给小白一份Python入门教程! Python 的排名从去年开始就借助人工智能持续上升,现在它已经成为了第一名。但排在前四名的语言 Python、C、Java 和 C++都拥有广大的用户群体,并且他们的用户总量也十分相近。实际上,Diakopoulos 在对公司招聘所要求的基本语言分析中,C 语言的需求甚至还要在 Python 之前。 Python老司机:给入门Python的小白支几招,简单粗暴Python的火热度持续不断。。。。。。 你觉得Python真的好吗?或许你在漫天的宣传中看到了这些: 接近英语的简单语法; 开发环境简单,能打字就能写代码; 众多的第三方库; 解释执行,不需要编译; 跨平台,方便移植; 那么,言归正传,我们今天就来给小白分享一下Python入门教程! Python 语言应该如何入门,如果你在网上随便搜了一下饥不择食的找了一些书开始啃起来,结果发现很疑惑,感觉吃力!...
- 下一篇
Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)
Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)简介在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现。MultiAction是多点触控的类,可以模拟用户多点操作。主要包含加载add()和执行perform()两个方法. 问题思考在使用地图App中,我们经常需要对界面进行缩放操作来更加便利的查看位置。那么在Appium中怎样去模拟这类操作呢? MultiActionMultiAction 是多点触控的类,可以模拟用户多点操作。主要包含 add() 和 perform() 两个方法, MultiAction可以结合前面所学的 ActionTouch可以模拟出用户的多个手指滑动的操作效果; MultiAction一般和TouchAction结合使用,故需要导入以下模块: from appium.webdriver.common.multi_action import MultiAction from appium.webdriver.common.touch_action imp...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器