Java8 Lambdas与匿名类

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只能用于单个方法接口,这个新功能只是在少数情况下使用的快捷方式还是真的有用?


慕莱坞森
浏览 685回答 3
3回答

慕妹3242003

Lambda虽然是一个很棒的功能,但只适用于SAM类型。也就是说,只有一个抽象方法的接口。只要您的界面包含多个抽象方法,它就会失败。这就是匿名类有用的地方。所以,不,我们不能只忽略匿名类。而就通知你,你的sort()方法可以更简化,通过跳过类型声明p1和p2:Collections.sort(personList,&nbsp;(p1,&nbsp;p2)&nbsp;->&nbsp;p1.firstName.compareTo(p2.firstName));您也可以在此处使用方法参考。要么compareByFirstName()在Person类中添加方法,请使用:Collections.sort(personList,&nbsp;Person::compareByFirstName);或者,为firstNameget&nbsp;方法添加一个getter&nbsp;,直接获取Comparatorfrom&nbsp;Comparator.comparing()方法:Collections.sort(personList,&nbsp;Comparator.comparing(Person::getFirstName));

MM们

使用匿名类进行Lambda性能启动应用程序时,必须加载并验证每个类文件。编译器将匿名类作为给定类或接口的新子类进行处理,因此将为每个类生成一个新的类文件。Lambda与字节码生成不同,它们更有效,使用JDK7附带的invokedynamic指令。对于Lambdas,此指令用于延迟在字节码中直接转换lambda表达式,直到运行时。(仅在第一次调用指令)因此,Lambda表达式将成为静态方法(在运行时创建)。(与stateles和statefull情况有一点不同,它们是通过生成的方法参数解决的)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java