Java系列之Predicate

这篇具有很好参考价值的文章主要介绍了Java系列之Predicate。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

接口源码

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

  1. 所有的函数式接口都带有@FunctionalInterface标明其身份;
  2. test()方法用来处理输入的参数t,计算得到输出结果为true还是false;
  3. 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风格的校验器:文章来源地址https://www.toymoban.com/news/detail-693724.html

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的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • M1 Mac Java8安装及环境配置(M系列都适用)

    目录 一、下载Java 1、官方地址: Java Downloads | Oracle 中国 Mac电脑的处理器架构类型 ①、 有账号登录即可,没有可以免费注册 二、安装java 1、如下图所示操作即可: 2、安装完成,点击关闭  3、这时Java已经安装成功 三、配置Java环境 1、打开终端输入java -version,验证是否安装

    2024年02月04日
    浏览(63)
  • SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 SpringCloud - Spring Cloud 之 Gateway网关(十三)_MinggeQingchun的博客-CSDN博客 Web 有三大组件(监听器 过滤器 servlet),Spring Cloud GateWay 最主要的功能就是路由转发,而在定义

    2024年02月14日
    浏览(67)
  • 【业务功能篇76】微服务网关路由predicates断言条件-filters路由转换地址-跨域问题-多级目录树化层级设计-mybatisPlus逻辑删除

    启动renren-fast如果出现如下错误 -Djps.track.ap.dependencies=false 添加相关配置即可 1.后端分类接口 JDK8特性:https://blog.csdn.net/qq_38526573/category_11113126.html 在后端服务中我们需要查询出所有的三级分类信息,并将这些信息组合为有父子关系的数据,所以首先我们需要在对应的entity中添

    2024年02月11日
    浏览(53)
  • Optional 类 - Java 8

    2023年04月18日
    浏览(37)
  • Java Optional

    Optional 是 Java 8 中引入的一个类,用于处理可能为空的值。它提供了一种优雅的方式来避免空指针异常,并在值存在时进行处理。下面是一些 Optional 的常用方法: 创建 Optional 对象: Optional.empty() : 创建一个空的 Optional 对象。 Optional.of(value) : 创建一个包含指定非空值的 Optio

    2024年02月07日
    浏览(39)
  • Java新特性:Optional类

    Java新特性:Optional类 Optional 类是 Java 8 才引入的,Optional 是个容器,它可以保存类型 T 的值,或者仅仅保存 null。Optional 提供了很多方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。 Java 8 引入 Optional 类,用来解决 NullPointerException。 Optional 代

    2024年02月16日
    浏览(44)
  • 在Java中正确使用Optional

    Optional类是在Java 8中引入的,用于解决NullPointerException的问题。 java.util.Optional类是一个泛型类型的类,只包含一个类型为T的值。其目的是提供对可能为null的类型T的引用对象的更安全的替代方案。但是,只有在正确使用的情况下,Optional对象才是安全的。 创建Optional对象的方式

    2024年01月16日
    浏览(39)
  • Java 10 - Optional类新方法

    2024年02月13日
    浏览(36)
  • 【Java基础教程】(三十一)常用类库篇 · 第一讲:Optional类——解锁Java的Optional操作,消灭那些隐匿的空指针,还程序世界一个安稳!~

    Optional 类是Java 8引入的新特性,旨在解决空值( null )的处理问题 。它的设计目的是为了提供一种更好的方式来处理可能为空的值,避免使用 null 导致空指针异常。 Optional 是一个容器对象,可以持有某个类型的非空值或者空值。它是一个包装类,用于替代可能为空的引用变

    2024年02月15日
    浏览(45)
  • 详细分析Java中的Optional类以及应用场景

    在实战中学习,灵活运用每个操作类,具体如下: 源码主要如下: 大致含义如下: 这是一个容器对象,可能包含或不包含非空值。如果有值存在,isPresent() 方法将返回 true,而 get() 方法将返回该值。 提供了一些依赖于包含值的存在或缺失的其他方法,例如 orElse()(如果值不

    2024年04月27日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包