当前位置: 首页 > 面试题库 >

Java8 Lambdas与匿名类

周学义
2023-03-14
问题内容

自从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只能与单个方法接口一起使用,此新功能仅是仅在少数情况下使用的快捷方式,还是真的有用吗?


问题答案:

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

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

更新

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



 类似资料:
  • VS 我习惯了第二种方法,但第一种方法是等价的吗?

  • 一个元素可以按照HTML元素的嵌套方式包含其他元素,大多数情况下,框都是由显式定义的元素所生成的。 然而,当把文本直接添加到一个块容器元素中(不是包含在行内元素)时,即便没有为这些文本显式定义元素,它们也会生成框。 没有被元素显式包含的文本,称作匿名文本,因为没有与之关联的元素。把匿名文本所生成框,称作匿名框。匿名框分为两种,一种是匿名块框,另一种是匿名行内框。 当把文本直接添加到一个块容器元素中

  • 匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下: 这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。 匿名类有两种实现方式: 继承一个类,重写其方法。 实现一个接口(可以是多个),实现其方法。 下面通过代码来说明。 程序的输出结果如下: 从输出结果可以看出,匿名内部类有

  • 模式匹配与匿名函数 上一章总结了模式在 Scala 中的几种用法,最后提到了匿名函数。 这一章,我们具体的去学习如何在匿名函数中使用模式。 如果你参与过 Coursera 上的 那门 Scala 课程 , 或者写过 Scala 代码,那很可能你已经熟悉匿名函数。 比如说,将一组歌名转换成小写格式,你可能会定义一个匿名函数传递给 map 方法: val songTitles = List("The

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定

  • 可能重复: 什么是双大括号初始化在Java? 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: 在调试模式下运行代码后,我发现匿名块是在调用构造函数之后调用的。上面的功能和做的有什么不同: ?我会认为它们在功能上是等价的,并且会认为后一种方式是更好/更干净的编写代码的方式。