Java8 predicate and_Java8: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)]

}

运行结果

b28892f5b82c70a140e4ef17b15f9396.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值