目录
3.2: 其余情况要么不需要参数,要么不需要返回结果,不再讨论。
一:问题&需求
代码难免会有很多重复代码的部分,比如数据检测,数据处理,数据返回。
如果这一部分交给了框架处理(AOP),自然是轻松的多。
先说简单的情况如下所示,按照idea提示,大概就是把通用代码提取出来。
差异化代码1
通用代码
差异化代码2
但是如果遇到以下情况呢?
通用前置检测代码
差异化代码
通用后置返回代码
你会怎么做?当然最好的办法是,写个方法把差异化代码当作参数传入进行执行。
二:java.util.function
做之前需要先了解jdk自带的 java.util.function 包,列举几个常用的和如何自己扩充构建。
Supplier<T> T get()
Consumer<T> void accept(T t)
Function<T, R> R apply(T t)
BiConsumer<T, U> void accept(T t, U u)
BiFunction<T, U, R> R apply(T t, U u)
....
等等很多,但就是做了一件事儿:接受若干个参数,以及是否要有返回值。
三:根据需求分开讨论。
3.1:差异代码既需要参数也有返回结果。
如果差异化代码需要前置代码的一个参数,并且返回一个参数交给后置代码执行。可以使用Consumer函数,具体如下。
public static void main(String[] args) {
System.out.println(service1());
System.out.println(service2());
}
//业务代码1
static String service1() {
return efficient((intParam) -> {
//差异化代码
intParam = intParam * 100;
return "A" + intParam + "A";
});
}
//业务代码2
static String service2() {
return efficient((intParam) -> {
//差异化代码
intParam = intParam * 666;
return "B" + intParam + "B";
});
}
static String efficient(Function<Integer, String> function) {
//前置代码。
//假设差异化代码需要前置代码执行结果为int的参数。
int a = (int) (System.currentTimeMillis() % 10);
String result = function.apply(a);
//后置代码。
//假设后置代码需要差异化代码执行结果为string的参数。
return "you result is :" + result;
}
执行结果
you result is :A300A
you result is :B1998B
3.2: 其余情况要么不需要参数,要么不需要返回结果,不再讨论。
四:如何按需设计自己的function
jdk自带的还是很局限,所以需要按需设计。
比如我需要三个传参,一个返回。可以设计如下
public interface ThreeFunction<A, B, C, R> {
R apply(A a, B b, C c);
}
设置是n个传参,是否返回都可以类似设计。
五:实际使用结果
controller层缩减了:547->306 缩减了44%
service层缩减了:806->566 缩减了30%
带来的是代码更加直观,简单,明了。