Java8 Lambda不仅仅只是语法糖

前端时间,项目升级到jdk1.8,尝试了下Lambda写法:
    public static void main(String[] args) {
        List lst = Arrays.asList("bb", "aa", "dd", "cc", "ee");
        // Lambda前
        for (String a : lst) {
            System.out.println(a);
        }   
        // Lambda后
        lst.forEach(a -> System.out.println(a));
    }
代码是简洁了些,但翻了翻源码:
    default void forEach(Consumersuper T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
只是简单地迭代,并没有什么性能方面的优势,反而lambda写法,对于我想调试a的情况,却会有诸多不便。
难道Lambda仅仅只是这么简单的语法糖吗?
举个例子,Comparator接口:
    Collections.sort(lst, new Comparator() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });
    lst.forEach(a -> System.out.println(a));
这种排序很常见,匿名类实现Comparator接口并重写compare方法。
那Lambda可以怎样写呢?
    Collections.sort(lst, (o1, o2) -> {
        return o1.compareTo(o2);
    });
    lst.forEach(a -> System.out.println(a));
没有了内部类,没有了override,取而代之的是lambda实现的匿名方法。
对于像Comparator这样,只有一个抽象方法的接口,java8中称之为函数式接口(FunctionalInterface)。凡是使用函数式接口的内部类,都可以用lambda替代。
如此看来,lambda带给我们的,不仅仅只是语法上的简洁,而是一种新的编程方式,可以将函数当做参数传递,有点C#里面委托的意思。
再举个例子,判断角色类型:lambda以前,我们需要使用到匿名类,再重写抽象方法check;有了lambda,可以使用“函数参数”轻松解决。
    public interface IRoleTypeChecker {
        // 角色类型判断器
        boolean check(String roleType);
    }
    // 角色判断私有方法
    private static boolean checkRole(String roleKey, IRoleTypeChecker roleTypeChecker) {
        if (roleTypeChecker.check(roleKey)) {
            return true;
        }
        return false;
    }
    // 匿名类写法
    public static boolean isCustomerLogon(String roleKey) {
        return checkRole(roleKey, new IRoleTypeChecker() {
            @Override
            public boolean check(String roleType) {
                return RoleTypeUtil.isCustomer(roleType);
            }
        });
    }
    // lambda写法
    public static boolean isCustomerLogon(String roleKey) {
        return checkRole(roleKey, r -> {
            return RoleTypeUtil.isCustomer(r);
        });
    }
所谓“函数参数”,虽然本质上也是用内部类实现。但是,那又怎样呢?我们完全可以将其理解为函数参数来简化我们的编程,不能将lambda简单理解为少写代码的语法糖。

你可能感兴趣的:(Java8 Lambda不仅仅只是语法糖)