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;

    /**
     * 添加一个校验策略,可以无限续杯
上一篇:标准库中的生成器函数


下一篇:浅谈C#中常见的委托<Func,Action,Predicate>