前端时间,项目升级到jdk1.8,尝试了下Lambda写法:
public static void main(String[] args) {
List<String> lst = Arrays.asList("bb", "aa", "dd", "cc", "ee");
for (String a : lst) {
System.out.println(a);
}
lst.forEach(a -> System.out.println(a));
}
代码是简洁了些,但翻了翻源码:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
只是简单地迭代,并没有什么性能方面的优势,反而lambda写法,对于我想调试a的情况,却会有诸多不便。
难道Lambda仅仅只是这么简单的语法糖吗?
举个例子,Comparator接口:
Collections.sort(lst, new Comparator<String>() {
@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);
}
});
}
public static boolean isCustomerLogon(String roleKey) {
return checkRole(roleKey, r -> {
return RoleTypeUtil.isCustomer(r);
});
}
所谓“函数参数”,虽然本质上也是用内部类实现。但是,那又怎样呢?我们完全可以将其理解为函数参数来简化我们的编程,不能将lambda简单理解为少写代码的语法糖。