当前位置: 首页 > 科技观察

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

时间:2023-03-14 09:12:16 科技观察

最近在导入Excel。数据校验是必不可少的,但是不同的数据领域有不同的校验策略,是多种多样的,甚至是不确定的。没有办法使用JSR303。所以让我们构建一个验证策略工具来抽象验证策略。这里我尝试了一个Java8提供的断言函数接口java.util.function.Predicate,非常强大!它封装了验证策略。Predicate接口Predicate的应用先看看效果:booleanvalidated=newValidator().with(s->s.length()>5).with(s->s.startsWith("felord")).with(s->s.endsWith("cn")).with(s->s.contains(".")).validate("felord.cn");我以验证字符串为例,通过一系列的Predicate断言来验证字符串felord.cn。这里不限于String提供的方法,只要满足String->boolean,即一个字符串输入参数可以得到一个布尔返回值,就可以作为条件。比如我们在数据库中检索某个字符串,我们可以写一个很普通的UserService来查询用户名是否存在或者是否有效:至:UserServiceImpluserService=newUserServiceImpl();booleanvalidated=newValidator().with(s->s.length()>5).with(s->s.startsWith("felord")).with(userService::checkUserByName).validate("felord.cn");好奇的同学应该想知道它是如何实现的。Validator源码如下:importjava.util.function.Predicate;publicclassValidator{/***初始化为truetrue&&其他布尔值由其他布尔值决定true或false*/privatePredicatepredicate=t->true;/***添加验证策略可以无限期地重新填充😀**@parampredicatethepredicate*@returnthevalidator*/publicValidatorwith(Predicatepredicate){this.predicate=this.predicate.and(predicate);returnthis;}/***Performvalidation**@paramtthet*@returntheboolean*/publicbooleanvalidate(Tt){returnpredicate.test(t);}}逻辑不是很复杂,但是可以处理各种复杂的断言策略组合。接下来,让我们仔细看看Predicate。Predicate@FunctionalInterfacepublicinterfacePredicate{/***函数式接口方??法*/booleantest(Tt);/***和默认方法等价于逻辑运算符&&*/defaultPredicateand(Predicateother){Objects.requireNonNull(其他);return(t)->test(t)&&other.test(t);}/***negatedefault方法相当于一个逻辑运算符!*/defaultPredicatenegate(){return(t)->!test(t);}/***or默认方法等价于逻辑运算符||*/defaultPredicateor(Predicateother){Objects.requireNonNull(other);return(t)->test(t)||other.test(t);}/***该方法是为{@linkObjects#equals(Object,Object)}提供的,不对开发者开放*/staticPredicateisEqual(ObjecttargetRef){return(null==targetRef)?Objects::isNull:object->targetRef.equals(object);}}断言函数接口提供了一个测试方法供我们开发实现,提供了And,negate,或对应于逻辑运算符&&,!,||分别在Java中。完全满足布尔变量运算,在需要多种条件策略组合时非常有用。小结今天通过演示Predicate的使用,回答了一位同学关于lambda表达式和函数式编程的使用问题。Java函数式编程的诞生“淘汰”了很多设计模式,尤其是策略模式。想要用好函数式编程,就需要加强自己的抽象能力,多看一些框架源码,不要强求使用函数式编程。开一个类似下面这行代码的玩笑:if(Objects.equals(bool,true)){//TODO}本文转载请联系码农小胖公众号。