Java Predicate接口源码使用示例

 更新时间:2025年04月09日 10:00:48   作者:千瞱  
Java8引入了许多函数式接口(Functional Interface),Predicate(断言)就是其中一个,它的主要作用可以简单描述为:向其传入一个对象(可以理解为参数),将得到一个布尔值作为输出,这篇文章主要介绍了Java Predicate接口源码使用示例,需要的朋友可以参考下

Java8引入了许多函数式接口(Functional Interface),Predicate(断言)就是其中一个,它的主要作用可以简单描述为:向其传入一个对象(可以理解为参数),将得到一个布尔值作为输出。

接口源码

Predicate接口的源码非常简单,如下所示,重点内容有:

所有的函数式接口都带有@FunctionalInterface标明其身份;test()方法用来处理输入的参数t,计算得到输出结果为true还是false;and(), negate(), or()函数功能类似与或非,能够进行串联;

@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);
    }
}

使用举例

看了上面的接口源码,你可能还是一知半解,这是一个接口,到底要怎么使用呢?看如下例子:

// 将实现用户名校验规则的lambda函数赋给Predicate实例
Predicate<String> isUserNameValid = u -> u != null && u.length() > 5 && u.length() < 10;
// 调用test方法,test方法的参数就是待检测的字符串(也就是喂给Predicate实例的数据),将会输出true
System.out.println(isUserNameValid.test("Howard"));
// 同样的道理
Predicate<String> isPasswordValid = p -> p != null && p.length() > 8 && p.length() < 15;
System.out.println(isPasswordValid.test("123456789"));

另外,在Java8的stream里面也有很多Predicate的应用,如filter函数的参数就是Predicate:

Arrays.asList("A1234567890", "Howard", "Tommy", "Jone").stream()
     .filter(str -> str.length() > 5)
     .filter(str -> str.length() < 10)
     .collect(Collectors.toList());

函数文档为:

java.util.stream.Stream<T>
public abstract Stream<T> filter(java.util.function.Predicate<? super T> predicate)

进阶举例

除了像上面这样定义单个的Predicate,也可以利用其and()等函数,将多个语句串联起来:

Predicate<String> predicate1 = str -> str.startsWith("A");
Predicate<String> predicate2 = str -> str.length() > 5;
Predicate<String> predicate3 = str -> str.length() < 10;
predicate1.and(predicate2).and(predicate3).test("A12347");  // true

除此之外,还可以对Predicate进行封装,构建Fluent API风格的校验器:

public class Validator<T> {
    private Predicate<T> predicate;
    public Validator() {
    	// 将predicate初始化为true
        this.predicate = t -> true;
    }
	// 添加校验策略,由于该函数返回this,因此可以无限使用and串联
    public Validator<T> with(Predicate<T> predicate) {
        this.predicate = this.predicate.and(predicate);
        return this;
    }
	// 执行校验,并返回校验结果
    public boolean validate(T t) {
        return this.predicate.test(t);
    }
}
public static void main(String[] args) {
    boolean result = new Validator<String>()
        .with(u -> u != null)
        .with(u -> u.length() > 5)
        .with(u -> u.length() < 10)
        .validate("Howard");
    System.out.println(result); // true
}

到此这篇关于Java Predicate接口源码使用示例的文章就介绍到这了,更多相关Java Predicate内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java常用注解扩展对比举例详解

    Java常用注解扩展对比举例详解

    这篇文章主要介绍了Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下
    2025-03-03
  • Java通过PropertyDescriptor反射调用set和get方法

    Java通过PropertyDescriptor反射调用set和get方法

    这篇文章主要为大家详细介绍了Java通过PropertyDescriptor反射调用set和get方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Redis 订阅发布_Jedis实现方法

    Redis 订阅发布_Jedis实现方法

    下面小编就为大家带来一篇Redis 订阅发布_Jedis实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • IDEA找不到database图标的简单图文解决方法

    IDEA找不到database图标的简单图文解决方法

    idea是一个功能十分强大的IDE,大家在使用他进行开发时候,必不可少的就是连接数据库了,这篇文章主要给大家介绍了关于IDEA找不到database图标的解决方法,需要的朋友可以参考下
    2024-07-07
  • Java查找并高亮PDF文本过程解析

    Java查找并高亮PDF文本过程解析

    这篇文章主要介绍了Java查找并高亮PDF文本过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Hibernate初体验及简单错误排除代码详解

    Hibernate初体验及简单错误排除代码详解

    这篇文章主要介绍了Hibernate初体验及简单错误排除代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java 对数和指数计算方式

    java 对数和指数计算方式

    这篇文章主要介绍了java 对数和指数计算方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springboot vue接口测试定义编辑功能的实现

    springboot vue接口测试定义编辑功能的实现

    这篇文章主要为大家介绍了springboot vue接口测试定义编辑功能的实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • RabbitMQ工作模式中的RPC通信模式详解

    RabbitMQ工作模式中的RPC通信模式详解

    在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧
    2025-06-06
  • idea为java程序添加启动参数的问题解析(program arguments,vm arguments,Environment variable)并在程序中获取使用

    idea为java程序添加启动参数的问题解析(program arguments,vm arguments,Envi

    这篇文章主要介绍了idea为java程序添加启动参数的问题解析(program arguments,vm arguments,Environment variable)并在程序中获取使用,本文给大家分享问题描述及解决方法,需要的朋友可以参考下
    2023-09-09

最新评论