本文主要讲 java8 里面的行为参数化部分,可能有点抽象,需要理解
首先,提一个需求,营销发奖,即根据一定的规则,判断该用户是否可以发奖,首先是最基本的定义:
public class PrizeAward {
/** 用户性别 */
public enum Sex{
MAN,WOMAN
}
class Person{
String name;
Sex gender;
public Person(String name,Sex gender){
this.name=name;
this.gender=gender;
}
}
public void award(Person person){
//如果符合规则,就进行发奖操作
}
}
说明:
- 定义 Person 类,表示待发奖的用户,有两个属性,分别是姓名和性别。
- 为了简单表示,将相关的定义都放在发奖类,只是为了展示的需要。
- award 方法是真正对外提供服务发奖逻辑,希望它尽可能稳定。
思考:
-
发奖的逻辑可能会非常多、非常复杂、非常多变,“多“体现在不同的不同的奖品,可能对应不同的发奖规则,可能根据姓名发奖,可能根据性别发奖,可能根据其他原则发奖;”复杂“体现在发奖内部可能有很多复杂逻辑,例如是否可以重复发,满额消费发奖,长期稳定用户发奖,新注册用户发奖等;”多变“体现在随着业务的发展,随时会有新的发奖逻辑,也随时会撤掉老的发奖逻辑,那么如何完善代码,可能让发奖逻辑尽可能稳定呢?
-
在以往写代码的过程中,方法的参数,一般是什么呢?
=>2 在我的认知里,参数一般是数据,无论是是简单的数据 String,int,或者是复杂的数据类型,总之是数据,在方法里面,我们会定义很多的动作,对这些数据进行加工和整合,得到某些结论。例如判断这些数据是真或假,对数据进行排序等。
=>1 为了让 award 方法尽可能稳定,我能想到的方式是将发奖规则存在数据库中,在 award 方法里面从数据库里捞出来规则,然后对参数 Person 进行匹配,因为数据库可以使用后台管理系统,灵活增、减、修改规则,那么 award 方法就会很稳定,无论怎么修改发奖,对外服务的 award 方法基本不变,这种方式相信在工业上是必然可行的,有点复杂,是不是??
还有一种方式,就是将用户匹配这种动作,作为参数传递给 award()方法,所谓发奖规则,无非是判断某用户张三能否发奖,这是一种动作,或者说是行为,行为是”判断“。
先看代码改写:
public class PrizeAward {
/** 用户性别 */
public enum Sex{
MAN,WOMAN
}
class Person{
String name;
Sex gender;
public Person(String name,Sex gender){
this.name=name;
this.gender=gender;
}
}
public void award(Predicate rule,Person person){
if (rule.test(person)){
//发奖
}
}
Predicate rule1 = (Person person)->{return "ruirui".equals(person.name);};
Predicate rule2 = (Person person)->{return "MAN".equals(person.gender);};
}
Predicate 是 jdk8 提供的函数式接口之一,其作用是判断,输入一个参数,自己实现某些规则,判断 true or false,非常符合我们这个场景,代码里面我定义了两条规则:
- 如果用户名是"ruirui",返回 true
- 如果性别是”MAN“,返回 true
请注意,这里依然是示意,规则可能非常多,规则逻辑可能会非常复杂。
最后,将 Predicate作为参数传递给 award()方法,思考一下 Predicate 参数扮演的角色是什么,是一个判断,判断用户 true or false,对比一下 Predicate 参数和 Person 参数的区别,person 仅仅是数据。
Predicate rule1 = (Person person)->{return "ruirui".equals(person.name);};
再单独看这条规则,可不可以认为这是一个函数,有一个输入 person,做了一系列动作,得到一个结论 true or false,函数就是这样子,这也是函数式编程的内在。
jdk8 升级以后,最大的变化是函数式编程,函数式编程只是表象,内里的思想应该是行为参数化,即将行为作为参数,或者说动作作为参数化,扩展了方法参数的内在。
上述例子是行为参数化的例子,行为是判断用户是否符合某发奖条件,可以在揣摩一下。
以上是个人的一些想法,关于函数式编程的学习尚未结束,因此不一定正确,有问题请指正。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于