这里类是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

  1. @Test

  2. public void whenFilterList_thenSuccess(){

  3. List<String> names = Arrays.asList("Adam", "Alexander", "John", "Tom");

  4. List<String> result = names.stream()

  5. .filter(name -> name.startsWith("A"))

  6. .collect(Collectors.toList());

  7. assertEquals(2, result.size());

  8. assertThat(result, contains("Adam","Alexander"));

  9. }

我们使用Predicate来筛选以大写字母A开头的姓名。

name -> name.startsWith("A")

那么如果多个条件这么办?

3. 多条件过滤

  1. @Test

  2. public void whenFilterListWithMultipleFilters_thenSuccess(){

  3. List<String> result = names.stream()

  4. .filter(name -> name.startsWith("A"))

  5. .filter(name -> name.length() < 5)

  6. .collect(Collectors.toList());

  7. assertEquals(1, result.size());

  8. assertThat(result, contains("Adam"));

  9. }

用两个filter传入两个Predicate分别过滤以A开头的和姓名长度小于5的。

4. 复杂条件

  1. @Test

  2. public void whenFilterListWithComplexPredicate_thenSuccess(){

  3. List<String> result = names.stream()

  4. .filter(name -> name.startsWith("A") && name.length() < 5)

  5. .collect(Collectors.toList());

  6. assertEquals(1, result.size());

  7. assertThat(result, contains("Adam"));

  8. }

使用一个filter传入复杂的Predicate.

5. 组合使用Predicate

Predicates可以将 Predicate.and(), Predicate.or()和 Predicate.negate()组合起来使用。

5.1. Predicate.and()

  1. @Test

  2. public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess(){

  3. Predicate<String> predicate1 = str -> str.startsWith("A");

  4. Predicate<String> predicate2 = str -> str.length() < 5;

  5. List<String> result = names.stream()

  6. .filter(predicate1.and(predicate2))

  7. .collect(Collectors.toList());

  8. assertEquals(1, result.size());

  9. assertThat(result, contains("Adam"));

  10. }

两个条件都要满足

5.2. Predicate.or()

满足其中一个即可

  1. @Test

  2. public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess(){

  3. Predicate<String> predicate1 = str -> str.startsWith("J");

  4. Predicate<String> predicate2 = str -> str.length() < 4;

  5. List<String> result = names.stream()

  6. .filter(predicate1.or(predicate2))

  7. .collect(Collectors.toList());

  8. assertEquals(2, result.size());

  9. assertThat(result, contains("John","Tom"));

  10. }

5.3. Predicate.negate()

将此条件取反

Predicate<String> predicate2 =  str -> str.length() < 4;

相当于

Predicate<String> predicate2 =  str -> str.length() >= 4;

  1. @Test

  2. public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess(){

  3. Predicate<String> predicate1 = str -> str.startsWith("J");

  4. Predicate<String> predicate2 = str -> str.length() < 4;

  5. List<String> result = names.stream()

  6. .filter(predicate1.or(predicate2.negate()))

  7. .collect(Collectors.toList());

  8. assertEquals(3, result.size());

  9. assertThat(result, contains("Adam","Alexander","John"));

  10. }

5.4. 内联的方式组合使用Predicates

  1. @Test

  2. public void whenFilterListWithCombinedPredicatesInline_thenSuccess(){

  3. List<String> result = names.stream()

  4. .filter(((Predicate<String>)name -> name.startsWith("A"))

  5. .and(name -> name.length()<5))

  6. .collect(Collectors.toList());

  7. assertEquals(1, result.size());

  8. assertThat(result, contains("Adam"));

  9. }

6. 组合Predicates集合

  1. @Test

  2. public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess(){

  3. List<Predicate<String>> allPredicates = new ArrayList<Predicate<String>>();

  4. allPredicates.add(str -> str.startsWith("A"));

  5. allPredicates.add(str -> str.contains("d"));

  6. allPredicates.add(str -> str.length() > 4);

  7. List<String> result = names.stream()

  8. .filter(allPredicates.stream().reduce(x->true, Predicate::and))

  9. .collect(Collectors.toList());

  10. assertEquals(1, result.size());

  11. assertThat(result, contains("Alexander"));

  12. }

注意这里初始条件是true

如果是false则不同:

  1. @Test

  2. public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess(){

  3. List<String> result = names.stream()

  4. .filter(allPredicates.stream().reduce(x->false, Predicate::or))

  5. .collect(Collectors.toList());

  6. assertEquals(2, result.size());

  7. assertThat(result, contains("Adam","Alexander"));

  8. }

java8 Predicate相关推荐

  1. Java8 Predicate接口

    Predicate 断言 使用 Predicate<Integer> predicate = x -> x > 5; Predicate<Integer> p = ...

  2. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  3. java private 接口_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  4. Java私有方法解释_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  5. java定义private_java9开始——接口中可以定义private私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  6. ios 地图 省市轮廓_iOS 14中的新增功能:视觉轮廓检测

    ios 地图 省市轮廓 WWDC20 (WWDC20) Apple's WWDC 2020 (digital-only) event kickstarted with a bang. There we ...

  7. java Lambda表达式练习

    关于JAVA8新特性,Lambda表达式的练习. java8更新许久,但从来没有试验整理过.借公司空闲之际,练习一下Lambda表达式! 练习题目,均为网上寻找题目(原版地址找不到了). 本文lamb ...

  8. Java8之Consumer、Supplier、Predicate和Function攻略

    今天我们还讲讲Consumer.Supplier.Predicate.Function这几个接口的用法,在 Java8 的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声的.为什么这么 ...

  9. Java8新特性概览——Stream特性,Lambda表达式,函数式接口Function、Predicate、Consumer,方法引用等概述

    概述: Java 8 新特性概述:https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/index.html JAVA8 十大新 ...

最新文章

  1. 为什么数学家、统计学家和机器学习专家会用不同方式解决问题?
  2. 怎么体验华为鸿蒙系统,华为mate40升级鸿蒙系统体验_华为mate40升级鸿蒙系统使用感受...
  3. 打造自己的数据访问层(二)
  4. Stanford UFLDL教程 微调多层自编码算法
  5. 3389爆破DUBrute_2.1
  6. Symbian和C++ SDK开发入门之运行
  7. 回文质数(洛谷-P1217)
  8. 食物和计算机中一样的英语,关于电脑和食物的英语口语
  9. Homebrew:无法符号链接,/ usr / local / bin不可写[关闭]
  10. MVC---张国亮总结心得第一季
  11. VS2017编译OpenJDK,编译通过的工程包下载链接
  12. sublime text3神器插件
  13. 洛谷 P1129 BZOJ 1059 cogs 660 [ZJOI2007]矩阵游戏
  14. C++实现RPG小游戏(彩色版)
  15. Java读取图片 cmyk转rgb
  16. win10桌面不见了如何找到
  17. r语言 rgl 强制过程中_R语言中编写最小工作示例(MWRE)
  18. Spring MVC拦截器(一)---定义,配置及单个拦截器执行流程
  19. 随机波动率微笑模型及套利
  20. 欧文工学院计算机,UCI的EECS「加州大学欧文分校电气工程与计算机科学系」

热门文章

  1. Z-DArg-GR-pNA,113711-77-6
  2. C#和WPF实现图形化编程
  3. 墨水屏(电子纸)的介绍与使用(附STM32程序~~~)
  4. 如何把魅族Pro 5刷成Ubuntu手机
  5. coresite美国数据中心你了解多少?
  6. 【最新排名(按点赞)】投票倒计时三天:继续为你喜欢的征文作品投票吧!...
  7. 你的华为手机还会卡?那是这3个功能没设置吧,越早关掉越好
  8. 【ElasticSearch和whoosh实现项目中搜索功能】
  9. 【工业互联网】一文读懂SAP Leonardo物联网平台
  10. V4L2图像采集+图片格式转换(YUYV、RGB、JPEG)