Java函数式断言接口Predicate的一个小小实践

Posted 码农小胖哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java函数式断言接口Predicate的一个小小实践相关的知识,希望对你有一定的参考价值。

最近在搞Excel导入,数据校验是少不了的,但是不同的数据字段有不同的校验策略,五花八门的,甚至不确定,没有办法使用JSR303。所以就搞一个校验策略工具,把校验策略抽象出来。这里尝试了Java 8 提供的一个断言函数接口java.util.function.Predicate<T>,非常给力Java函数式断言接口Predicate的一个小小实践!把校验策略完美地封装了起来。

Java函数式断言接口Predicate的一个小小实践
Predicate 接口

Predicate 的应用

先来看看效果:

    boolean validated = new Validator<String>()
            .with(s -> s.length() > 5)
            .with(s -> s.startsWith("felord"))
            .with(s -> s.endsWith("cn"))
            .with(s -> s.contains("."))
            .validate("felord.cn");

我拿校验字符串为例子,通过一系列的Predicate<String>断言来对字符串felord.cn进行校验。这里不局限于String提供的方法,只要你满足 String -> boolean,也就是一个字符串入参能得到一个布尔返回值,都可以作为条件。例如我们在数据库中检索某个字符串,我们可以写一个非常常见的UserService查询用户名是否存在或者有效:

public class UserServiceImpl implements UserService {
    @Override
    public boolean checkUserByName(String name) {
        return false;
    }
}

对应的校验可以改为:

    UserServiceImpl userService = new UserServiceImpl();
    boolean validated = new Validator<String>()
            .with(s -> s.length() > 5)
            .with(s -> s.startsWith("felord"))
            .with(userService::checkUserByName)
            .validate("felord.cn");

好奇的同学该想知道是怎么实现的,Validator<T>源码是这样的:

import java.util.function.Predicate;
 
public class Validator<T{
    /**
     * 初始化为 true  true &&其它布尔值时由其它布尔值决定真假
     */

    private Predicate<T> predicate = t -> true;

    /**
     * 添加一个校验策略,可以无限续杯

以上是关于Java函数式断言接口Predicate的一个小小实践的主要内容,如果未能解决你的问题,请参考以下文章

逐步走向响应式编程-常见函数式接口- Predicate<T>

Java 常用函数式接口 —— Predicate接口

Spring Cloud Alibaba - 24 Gateway-路由断言(Predicate)过滤器(Filter)初体验

Java常用函数式接口--Predicate接口使用案例

Java 8 - Predicate和Consumer接口函数式编程

Java 8 - Predicate和Consumer接口函数式编程