Java8 Lambdas与匿名类由于Java8最近已经发布,并且它的全新lambda表达式看起来非常酷,我想知道这是否意味着我们习以为常的Anonymous类的消亡。我一直在研究这个问题,并找到了一些关于Lambda表达式如何系统地替换这些类的很酷的例子,例如Collection的sort方法,它用于获取Comparator的Anonymous实例来执行排序:Collections.sort(personList, new Comparator<Person>(){
public int compare(Person p1, Person p2){
return p1.firstName.compareTo(p2.firstName);
}});现在可以使用Lambdas完成:Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName));而且看起来非常简洁。所以我的问题是,有没有理由继续在Java8中使用这些类而不是Lambdas?编辑同样的问题,但在相反的方向,使用Lambdas而不是匿名类有什么好处,因为Lambdas只能用于单个方法接口,这个新功能只是在少数情况下使用的快捷方式还是真的有用?
3 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
Lambda虽然是一个很棒的功能,但只适用于SAM类型。也就是说,只有一个抽象方法的接口。只要您的界面包含多个抽象方法,它就会失败。这就是匿名类有用的地方。
所以,不,我们不能只忽略匿名类。而就通知你,你的sort()方法可以更简化,通过跳过类型声明p1和p2:
Collections.sort(personList, (p1, p2) -> p1.firstName.compareTo(p2.firstName));
您也可以在此处使用方法参考。要么compareByFirstName()在Person类中添加方法,请使用:
Collections.sort(personList, Person::compareByFirstName);
或者,为firstNameget 方法添加一个getter ,直接获取Comparatorfrom Comparator.comparing()方法:
Collections.sort(personList, Comparator.comparing(Person::getFirstName));
MM们
TA贡献1886条经验 获得超2个赞
使用匿名类进行Lambda性能
启动应用程序时,必须加载并验证每个类文件。
编译器将匿名类作为给定类或接口的新子类进行处理,因此将为每个类生成一个新的类文件。
Lambda与字节码生成不同,它们更有效,使用JDK7附带的invokedynamic指令。
对于Lambdas,此指令用于延迟在字节码中直接转换lambda表达式,直到运行时。(仅在第一次调用指令)
因此,Lambda表达式将成为静态方法(在运行时创建)。(与stateles和statefull情况有一点不同,它们是通过生成的方法参数解决的)
添加回答
举报
0/150
提交
取消
