一尘不染

Java8 Lambdas与匿名类

java

自从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中使用这些类而不是Lambda?

编辑

同样的问题,但方向相反,使用Lambdas代替Anonymous类有什么好处,因为Lambdas只能与单个方法接口一起使用,此新功能仅是仅在少数情况下使用的快捷方式,还是真的有用吗?


阅读 501

收藏
2020-03-07

共1个答案

一尘不染

匿名内部类(AIC)可用于创建抽象类或具体类的子类。AIC还可以提供接口的具体实现,包括添加状态(字段)。可以在AIC this的方法主体中使用AIC的实例,因此可以在其上调用其他方法,其状态可以随时间变化,等等。这些都不适用于lambda。

我猜想AIC的大多数用途是提供单个功能的无状态实现,因此可以用lambda表达式代替,但是AIC的其他用途不能使用lambda。AIC在这里停留。

更新

AIC和lambda表达式之间的另一个区别是AIC引入了新的范围。也就是说,名称是通过AIC的超类和接口解析的,并且可以遮盖出现在词法包围环境中的名称。对于lambda,所有名称都按词法解析。

2020-03-07