《Effective Java》解读第42条:Lambda优先于匿名类
·
第42条:Lambda优先于匿名类
在Java 8及以后版本中,创建函数式接口(只有一个抽象方法的接口)的实例时,应该优先使用Lambda表达式,而不是传统的匿名类。
Lambda和匿名类
在Java 8之前,函数式接口的实例,通常通过匿名类来创建。匿名类虽然有用,但其语法过于冗长,引入了大量的样板代码,不必要地降低了代码的可读性。
传统匿名类创建:
List<String> words = Arrays.asList("apple", "banana", "cherry");
// 使用匿名类---
Collections.sort(words, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
Lambda创建:
Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
只需简单的一行,而且无需显示类型int和string,编译器可以自行推导,在某些情况下,编译器无法确定类型,你就必须指定。所以删除所有 Lambda 参数的类型吧,除非它们的存在能够使程序变得更加清晰。
还可以更加简洁:
words.sort(Comparator.comparingInt(String::length));
当然,Lambda也不是万能的
-
处理非函数式接口:如果你想创建的实例,其类型是一个抽象类,或者是一个包含多个抽象方法的接口,那么匿名类就是你唯一的选择。
-
需要访问“自己”:如果代码块内部需要引用当前对象(this),例如调用当前实例的其他方法,就必须使用匿名类,因为在Lambda中的this指向的是外部类。
-
代码逻辑过于复杂:Lambda应该非常简短(最好一行,最多不超过三行)。如果一个函数对象的逻辑很复杂,以至于影响可读性,就应该将其抽取为一个有名字的方法,或退而使用匿名类,以便于理解和维护。
更多推荐




所有评论(0)