最近看项目的代码,发现同事写的一个job中某段比较神奇的代码,出于某种原因,不便展示原始代码,这里以伪代码来代替:
public class Job {
public static void main(String[] args) {
String type = "1";
Integer limit = 1;
Calendar calendar = Calendar.getInstance();
if ("1".equals(type)) {
doTrans1(limit, calendar);
} else if ("2".equals(type)) {
doTrans2(limit, calendar);
} else if ("3".equals(type)) {
doTrans3(limit, calendar);
} else if ("4".equals(type)) {
doTrans4(limit, calendar);
} else if ("5".equals(type)) {
doTrans5(limit, calendar);
} else if ("6".equals(type)) {
doTrans6(limit, calendar);
}
}
public static Integer doTrans1(Integer limit, Calendar calendar) {
// todo 事务操作
return 1;
}
public static Integer doTrans2(Integer limit, Calendar calendar) {
// todo 事务操作
return 2;
}
public static Integer doTrans3(Integer limit, Calendar calendar) {
// todo 事务操作
return 3;
}
public static Integer doTrans4(Integer limit, Calendar calendar) {
// todo 事务操作
return 4;
}
public static Integer doTrans5(Integer limit, Calendar calendar) {
// todo 事务操作
return 5;
}
public static Integer doTrans6(Integer limit, Calendar calendar) {
// todo 事务操作
return 6;
}
}
if else太多了,写的时候很爽,直接堆上去,但是这种代码写出来还是不够优雅的,而且每次执行的时候都需要走一大堆的判断,这样效率太低了,于是便简单的改造了一下:
public class Main {
static Map<String, BiFunction<Integer, Calendar, Integer>> methodsMap = new HashMap<>();
static {
methodsMap.put("1", Main::doTrans1);
methodsMap.put("2", Main::doTrans2);
methodsMap.put("3", Main::doTrans3);
methodsMap.put("4", Main::doTrans4);
methodsMap.put("5", Main::doTrans5);
methodsMap.put("6", Main::doTrans6);
}
public static void main(String[] args) {
Integer limit = 1;
Calendar calendar = Calendar.getInstance();
BiFunction<Integer, Calendar, Integer> biFunction = methodsMap.get("5");
System.out.println("执行结果:" + biFunction.apply(limit, calendar));
}
public static Integer doTrans1(Integer limit, Calendar calendar) {
// todo 事务操作
return 1;
}
public static Integer doTrans2(Integer limit, Calendar calendar) {
// todo 事务操作
return 2;
}
public static Integer doTrans3(Integer limit, Calendar calendar) {
// todo 事务操作
return 3;
}
public static Integer doTrans4(Integer limit, Calendar calendar) {
// todo 事务操作
return 4;
}
public static Integer doTrans5(Integer limit, Calendar calendar) {
// todo 事务操作
return 5;
}
public static Integer doTrans6(Integer limit, Calendar calendar) {
// todo 事务操作
return 6;
}
}
这样用map缓存起来,不用每次进方法的时候都走一遍判断,效率更高了,也更优雅了