java8 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)); //输出 trueSystem.out.println(predicate.test(6)); //输出 fasle/*** 2、大于7并且*///在上面大于7的条件下,添加是偶数的条件predicate = predicate.and(x -> x % 2 == 0);System.out.println(predicate.test(6)); //输出 fasleSystem.out.println(predicate.test(12)); //输出 trueSystem.out.println(predicate.test(13)); //输出 fasle/*** 3、add or 简化写法*/predicate = x -> x > 5 && x < 9;System.out.println(predicate.test(10)); //输出 falseSystem.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*/@Overridepublic boolean equals(Object obj) {if (obj instanceof User) {User user = (User) obj;if (name.equals(user.name)){return true;}}return false;}@Overridepublic 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直接使用 distinctList<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)]}
运行结果
基本用法
怎么使用简单的Predicate来过滤list中的name
@Test
public void whenFilterList_thenSuccess(){
List<String> names = Arrays.asList("Adam", "Alexander", "John", "Tom");
List<String> result = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertThat(result, contains("Adam","Alexander"));
}
我们使用Predicate来筛选以大写字母A开头的姓名。
name -> name.startsWith("A")
那么如果多个条件这么办?
3. 多条件过滤
@Test
public void whenFilterListWithMultipleFilters_thenSuccess(){
List<String> result = names.stream()
.filter(name -> name.startsWith("A"))
.filter(name -> name.length() < 5)
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains("Adam"));
}
用两个filter传入两个Predicate分别过滤以A开头的和姓名长度小于5的。
4. 复杂条件
@Test
public void whenFilterListWithComplexPredicate_thenSuccess(){
List<String> result = names.stream()
.filter(name -> name.startsWith("A") && name.length() < 5)
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains("Adam"));
}
使用一个filter传入复杂的Predicate.
5. 组合使用Predicate
Predicates可以将 Predicate.and(), Predicate.or()和 Predicate.negate()组合起来使用。
5.1. Predicate.and()
@Test
public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess(){
Predicate<String> predicate1 = str -> str.startsWith("A");
Predicate<String> predicate2 = str -> str.length() < 5;
List<String> result = names.stream()
.filter(predicate1.and(predicate2))
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains("Adam"));
}
两个条件都要满足
5.2. Predicate.or()
满足其中一个即可
@Test
public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess(){
Predicate<String> predicate1 = str -> str.startsWith("J");
Predicate<String> predicate2 = str -> str.length() < 4;
List<String> result = names.stream()
.filter(predicate1.or(predicate2))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertThat(result, contains("John","Tom"));
}
5.3. Predicate.negate()
将此条件取反
Predicate<String> predicate2 = str -> str.length() < 4;
相当于
Predicate<String> predicate2 = str -> str.length() >= 4;
@Test
public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess(){
Predicate<String> predicate1 = str -> str.startsWith("J");
Predicate<String> predicate2 = str -> str.length() < 4;
List<String> result = names.stream()
.filter(predicate1.or(predicate2.negate()))
.collect(Collectors.toList());
assertEquals(3, result.size());
assertThat(result, contains("Adam","Alexander","John"));
}
5.4. 内联的方式组合使用Predicates
@Test
public void whenFilterListWithCombinedPredicatesInline_thenSuccess(){
List<String> result = names.stream()
.filter(((Predicate<String>)name -> name.startsWith("A"))
.and(name -> name.length()<5))
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains("Adam"));
}
6. 组合Predicates集合
@Test
public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess(){
List<Predicate<String>> allPredicates = new ArrayList<Predicate<String>>();
allPredicates.add(str -> str.startsWith("A"));
allPredicates.add(str -> str.contains("d"));
allPredicates.add(str -> str.length() > 4);
List<String> result = names.stream()
.filter(allPredicates.stream().reduce(x->true, Predicate::and))
.collect(Collectors.toList());
assertEquals(1, result.size());
assertThat(result, contains("Alexander"));
}
注意这里初始条件是true
如果是false则不同:
@Test
public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess(){
List<String> result = names.stream()
.filter(allPredicates.stream().reduce(x->false, Predicate::or))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertThat(result, contains("Adam","Alexander"));
}
java8 Predicate相关推荐
- Java8 Predicate接口
Predicate 断言 使用 Predicate<Integer> predicate = x -> x > 5; Predicate<Integer> p = ...
- abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- java private 接口_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- Java私有方法解释_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- java定义private_java9开始——接口中可以定义private私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- ios 地图 省市轮廓_iOS 14中的新增功能:视觉轮廓检测
ios 地图 省市轮廓 WWDC20 (WWDC20) Apple's WWDC 2020 (digital-only) event kickstarted with a bang. There we ...
- java Lambda表达式练习
关于JAVA8新特性,Lambda表达式的练习. java8更新许久,但从来没有试验整理过.借公司空闲之际,练习一下Lambda表达式! 练习题目,均为网上寻找题目(原版地址找不到了). 本文lamb ...
- Java8之Consumer、Supplier、Predicate和Function攻略
今天我们还讲讲Consumer.Supplier.Predicate.Function这几个接口的用法,在 Java8 的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声的.为什么这么 ...
- Java8新特性概览——Stream特性,Lambda表达式,函数式接口Function、Predicate、Consumer,方法引用等概述
概述: Java 8 新特性概述:https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/index.html JAVA8 十大新 ...
最新文章
- 为什么数学家、统计学家和机器学习专家会用不同方式解决问题?
- 怎么体验华为鸿蒙系统,华为mate40升级鸿蒙系统体验_华为mate40升级鸿蒙系统使用感受...
- 打造自己的数据访问层(二)
- Stanford UFLDL教程 微调多层自编码算法
- 3389爆破DUBrute_2.1
- Symbian和C++ SDK开发入门之运行
- 回文质数(洛谷-P1217)
- 食物和计算机中一样的英语,关于电脑和食物的英语口语
- Homebrew:无法符号链接,/ usr / local / bin不可写[关闭]
- MVC---张国亮总结心得第一季
- VS2017编译OpenJDK,编译通过的工程包下载链接
- sublime text3神器插件
- 洛谷 P1129 BZOJ 1059 cogs 660 [ZJOI2007]矩阵游戏
- C++实现RPG小游戏(彩色版)
- Java读取图片 cmyk转rgb
- win10桌面不见了如何找到
- r语言 rgl 强制过程中_R语言中编写最小工作示例(MWRE)
- Spring MVC拦截器(一)---定义,配置及单个拦截器执行流程
- 随机波动率微笑模型及套利
- 欧文工学院计算机,UCI的EECS「加州大学欧文分校电气工程与计算机科学系」
热门文章
- Z-DArg-GR-pNA,113711-77-6
- C#和WPF实现图形化编程
- 墨水屏(电子纸)的介绍与使用(附STM32程序~~~)
- 如何把魅族Pro 5刷成Ubuntu手机
- coresite美国数据中心你了解多少?
- 【最新排名(按点赞)】投票倒计时三天:继续为你喜欢的征文作品投票吧!...
- 你的华为手机还会卡?那是这3个功能没设置吧,越早关掉越好
- 【ElasticSearch和whoosh实现项目中搜索功能】
- 【工业互联网】一文读懂SAP Leonardo物联网平台
- V4L2图像采集+图片格式转换(YUYV、RGB、JPEG)