记一次Java8的Lambda表达式的使用

148 阅读1分钟

最近看项目的代码,发现同事写的一个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缓存起来,不用每次进方法的时候都走一遍判断,效率更高了,也更优雅了