java.util.function.Predicate

本文深入解析了Java 8中的Predicate接口,展示了如何使用它进行条件判断、逻辑组合以及在集合Stream操作中的应用。通过实例代码,详细解释了Predicate的test方法以及and、negate、or等默认方法的使用,同时提供了在实际场景中筛选、去重等操作的示例。
摘要由CSDN通过智能技术生成

一、java.util.function.Predicate

求最大值,代码保存

        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        Optional<Integer> max = numbers.stream().reduce(Integer::max);
        System.out.println(max.orElse(0));
        System.out.println(numbers.stream().max(Integer::compare).get());
        System.out.println(numbers.stream().mapToInt(i -> i).max().getAsInt());

这里类是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)); //输出 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)]
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值