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