当前位置: 首页 > 知识库问答 >
问题:

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

共有1个答案

席成仁
2023-03-14

Lambda表达式不会改变您通常可以用Java解决的问题集,但肯定会使解决某些问题变得更容易,这与我们不再使用汇编语言编程的原因是一样的。从程序员的工作中移除多余的任务可以使生活变得更简单,并允许您做一些您在其他情况下甚至不会接触到的事情,只是为了减少您必须(手动)生成的代码量。

但是lambda表达式不仅仅是节省代码行。Lambda表达式允许您定义函数,在此之前您可以使用匿名内部类作为解决方法,这就是为什么您可以在这些情况下替换匿名内部类的原因,但不是在一般情况下。

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

此外,构造new Type(){…}保证生成一个新的不同实例(就像new总是这样)。如果在非静态上下文中创建,匿名内部类实例总是保留对其外部实例的引用。相反,lambda表达式仅在需要时捕获对this的引用,即如果它们访问this或非静态成员。并且它们生成有意未指定标识的实例,这允许实现在运行时决定是否重用现有实例(另请参见“lambda表达式是否每次执行时都会在堆上创建对象?”)。

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

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

 类似资料:
  • 问题内容: 除了保存代码行以外,lambda表达式还有其他用途吗? lambdas是否提供任何特殊功能来解决不容易解决的问题?我看到的典型用法是代替编写此代码: 我们可以使用lambda表达式来缩短代码: 问题答案: Lambda表达式通常不会改变您可以使用Java解决的问题集,但是肯定会使解决某些问题变得更加容易,这是因为我们不再使用汇编语言进行编程的原因。从程序员的工作中删除多余的任务可以使工

  • 问题内容: 我想在后端计算地理围栏违规和行车距离计算。这是我第一次使用google API。我在网上发现的所有内容都是针对Android的。是否有特定于常规计算的API。 问题答案: 您可以自己实现它,而无需使用任何框架,这非常容易… 我假设您要检查您是否在圆形地理围栏内。 为此,只需计算圆心与您的位置之间的距离(经度,纬度)。如果距离小于圆半径,则说明您在地理围栏内,否则就在地理围栏外。 像这样

  • 有没有可能通过JSONPath知道其他“路径”的存在? 我所说的现有“路径”是指类似于此JSON的“a.b.c”或“a.b.d”形式的字符串: 可以写一个JSONPath来判断除了a. b. c和a. b. d之外是否还有其他“路径”吗? 例如,在下面的JSON中,它应该发现有属性'e':

  • 问题内容: 所以可以说我有这个界面: 我有一个实现它的类: 如果我想使用接口IBox,则无法以这种方式实际创建它的实例: 对?所以我实际上必须这样做: 如果是这样,那么接口的唯一目的是确保实现接口的类中具有接口所描述的正确方法?还是接口还有其他用途? 问题答案: 接口是使代码更灵活的一种方法。你要做的是: 然后,稍后,如果你决定要使用其他类型的框(也许还有另一个库,其中框的类型更好),则将代码切换

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

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