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

除了保存代码行以外,lambda表达式还有其他用途吗?

濮阳俊明
2023-03-14
问题内容

除了保存代码行以外,lambda表达式还有其他用途吗?

lambdas是否提供任何特殊功能来解决不容易解决的问题?我看到的典型用法是代替编写此代码:

Comparator<Developer> byName = new Comparator<Developer>() {
  @Override
  public int compare(Developer o1, Developer o2) {
    return o1.getName().compareTo(o2.getName());
  }
};

我们可以使用lambda表达式来缩短代码:

Comparator<Developer> byName =
(Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName());

问题答案:

Lambda表达式通常不会改变您可以使用Java解决的问题集,但是肯定会使解决某些问题变得更加容易,这是因为我们不再使用汇编语言进行编程的原因。从程序员的工作中删除多余的任务可以使工作变得更轻松,并且可以执行您本来不会碰到的事情,而只是要产生大量的代码(手动)。

但是lambda表达式不仅节省了代码行。Lambda表达式使您可以定义 函数
,以前可以使用它们作为变通方法来解决这些问题,这就是为什么在这种情况下(但一般而言)不能替换匿名内部类的原因。

最值得注意的是,lambda表达式是独立于它们将要转换到的功能接口定义的,因此没有继承的成员可以访问,而且,它们不能访问实现该功能接口的类型的实例。在lambda表达式中,this并且super具有与周围环境相同的含义。同样,您不能创建新的局部变量来遮盖周围上下文的局部变量。对于定义函数的预期任务,这消除了很多错误源,但是这也意味着对于其他用例,即使实现了功能接口,也可能存在无法转换为lambda表达式的匿名内部类。

此外,该构造new Type() { …}保证产生一个新的独特实例(new一如既往)。如果在非static上下文中创建,匿名内部类实例始终保留对其外部实例的引用。相反,lambda表达式仅this在需要时(即它们访问this或为非static成员时)捕获对的引用。它们会生成一个有意未指定身份的实例,这使实现可以在运行时决定是否重用现有实例
”)。

这些差异适用于您的示例。您的匿名内部类构造将始终产生一个新实例,也可能捕获对外部实例的引用,而您(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName())是一个不捕获的lambda表达式,在典型实现中其结果将为单例。此外,它不会.class在硬盘驱动器上生成文件

考虑到语义和性能方面的差异,lambda表达式可能会改变程序员将来解决某些问题的方式,当然,这也是由于新的API包含了利用新语言功能进行功能编程的思想。另请参见[Java
8 lambda表达式和一等值。



 类似资料:
  • lambda表达式除了保存代码行之外还有其他用途吗? lambdas提供了什么特殊功能来解决那些不容易解决的问题吗?我见过的典型用法是: 我们可以使用一个lambda表达式来缩短代码:

  • 问题内容: 我正在研究部分应用程序的使用情况,但是我只能找到有关使用专有sun实现或Oracle特定实现的信息。 sun的实现不受支持,并且可能会发生变化。如果将来我想将其部署到非Sun虚拟机上,使用此方法也可能会导致问题,最后,它在构建日志中留下了无法抑制的警告,可以掩盖其他警告。 我是否可以与我的应用程序一起部署一个开源替代实现,该实现在多个数据库之间都能很好地工作?至少支持MySQL的东西。

  • 问题内容: 我在Windows 7上使用VirtualBox 5.0.6安装了Docker工具箱1.8.3。 在 Docker Quickstart Terminal 启动期间创建的 默认 虚拟机为定义了一个共享文件夹。是否可以将其他共享文件夹永久添加到该虚拟机,例如在主机上安装驱动器? __ 问题答案: 该boot2docker自述中提到 另外,Boot2Docker包括内置的VirtualBo

  • Mybatis 和 Hibernate 各有各的优点吧,感觉用久了有点腻了。 查了一下,还有一种基于 JOOQ 的查询,像写 C# 的 LINQ 一样用 Java 来写 SQL,站内有一个介绍看了感觉还行 https://segmentfault.com/a/1190000045244062 所以 JOOQ、Hibernate、Mybatis Java 应该就是这三种 Dao Layer 的框架了

  • 问题内容: 为什么没有人提及嵌套循环联接? 问题答案: 如果希望/可以读取未提交的记录,则在联接上使用(NOLOCK)可能会提高性能。 什么时候应该使用“with(nolock)”

  • 让我们举一些简单的示例代码: 根据我的理解,lambda是用来创建一个函数接口的subistute的(只有1个方法),空括号表示该方法没有参数。 但是在OrelsThrow中调用什么方法需要lambda呢?我以为它要么是要么是。 所以我的问题是:如果没有lambda调用,这会是什么样子? 员工类别: