为了账号安全,请及时绑定邮箱和手机立即绑定

Java8 Lambdas与匿名类

Java8 Lambdas与匿名类

慕莱坞森 2019-08-12 11:01:38
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()方法可以更简化,通过跳过类型声明p1p2

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));


查看完整回答
反对 回复 2019-08-12
?
MM们

TA贡献1886条经验 获得超2个赞

使用匿名类进行Lambda性能

启动应用程序时,必须加载并验证每个类文件。

编译器将匿名类作为给定类或接口的新子类进行处理,因此将为每个类生成一个新的类文件。

Lambda与字节码生成不同,它们更有效,使用JDK7附带的invokedynamic指令。

对于Lambdas,此指令用于延迟在字节码中直接转换lambda表达式,直到运行时。(仅在第一次调用指令)

因此,Lambda表达式将成为静态方法(在运行时创建)。(与stateles和statefull情况有一点不同,它们是通过生成的方法参数解决的)


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 731 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号