在 Java 中使用 lambda 表达式有运行时优势吗? [关闭]

2024-04-09

我正在阅读一些关于 Java 8 中提供的 lambda 表达式的博客和答案。

我无法弄清楚单位 lambda 表达式是否有任何运行时优势?

我从不同来源复制了以下文本,这些文本对我来说太令人困惑了。

一个答案是——

“lambda 不会创建新的作用域,它们与 lambda 共享相同的作用域 封闭块/环境”

在一篇博客中——

“使用 lambda 表达式没有运行时优势,所以我会 谨慎使用它,因为我不介意多写几行 代码。”

来自另一个博客 -

“lambda 表达式的另一个好处是顺序执行和并行执行 通过在方法中传递行为来支持”

所以我有很多困惑。 请帮助我澄清这一点,以便我可以在深入研究这些内容之前避免记住错误的方法。

我已经运行了以下代码,我可以说以下代码中的 lambda 表达式只是匿名内部类及其在主线程上运行的替换。

List<Integer> list = new ArrayList<>();
list.add(12);
list.forEach(V -> {
    System.out.println(V);
});

我们是否降低了时间复杂度或空间复杂度?


lambda 不会创建新的作用域,它们与封闭的块/环境共享相同的作用域” 是一个几乎正确的陈述(它们确实创建了一个新的作用域,但不是像内部类那样),但与运行时性能没有任何关系。这与正确性的代码。

在匿名内部类中,标识符可以通过词法作用域来解析,在周围作用域中查找匹配,或者通过继承,在匿名内部类的类层次结构中查找匹配。这种场景下解析标识符的规则很复杂,而且很容易混淆。

此外,匿名类的主体创建了一个新的作用域,允许创建与周围上下文的局部变量同名的变量,从而隐藏这些变量。

相比之下,lambda 表达式在编写它们的上下文中的工作方式与其他表达式类似。它们不会从要转换到的函数接口继承任何成员,它们不能创建隐藏现有局部变量的新变量,甚至this and super与周围上下文中的含义相同:

JLS§15.27.2. Lambda Body https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.2

与匿名类声明中出现的代码不同,名称的含义和this and super出现在 lambda 主体中的关键字以及引用声明的可访问性与周围上下文中的相同(除了 lambda 参数引入了新名称)。

所以当你有表达方式时x.foo(y) and () -> x.foo(y)在同一个块内,很明显x and y将会是一样的x and y对于这两个表达式,因此它是相同的foo每种情况下的方法,对于匿名内部类来说不能说那么简单,因为您必须首先分析整个内部类及其类型层次结构。

这使得 lambda 表达式非常适合您想要定义局部函数的场景,例如将它作为参数传递给方法,甚至不考虑实际的interface正在使用。除了定义函数签名之外,接口本身不会影响 lambda 表达式。

但这也意味着可能存在 lambda 表达式无法涵盖的匿名类用例。但 lambda 表达式的目的并不是要替代匿名内部类。


当谈到性能或易于并行处理时,什莫塞尔的回答 https://stackoverflow.com/a/48376002/2711488已经说过了。如果不知道我们正在研究哪个操作/问题以及我们实际上正在比较哪些解决方案,我们就无法做出这样的笼统陈述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中使用 lambda 表达式有运行时优势吗? [关闭] 的相关文章

随机推荐

  • 如何确保在 .NET 中正确处理对象?

    我创建了一个Windows 窗体 http en wikipedia org wiki Windows Forms NET 2 中使用连续运行的 C 的应用程序 对于大多数帐户 我对此感到满意 但有人向我报告 它偶尔会失败 我能够在 50
  • 访问2007到exe

    我在 MS Access 2007 中有一个带有表单的数据库 我需要从访问创建一个独立的 exe 文件 是否可以 如果是这样 怎么办 您不能将其另存为 exe 但您可以使用允许没有访问权限的用户使用您的应用程序
  • 使用 CFExecute 运行 VBScript 会引发错误,但通过命令行可以正常工作

    我正在尝试运行 VBScript 但 CFExecute 抛出错误
  • Django:使用管理上下文扩展基于类的视图的上下文

    我有一个基于类的视图 它只显示配置列表 使用以下代码将此视图添加到 Django 管理站点 admin register ZbxHostConf class ZbxHostConfListViewAdmin admin ModelAdmin
  • MS Graph API:身份验证令牌无效

    我正在尝试使用 Microsoft Graph API 查询 Outlook O365 邮箱中的邮件 我注册我的应用程序 https graph microsoft io en us docs authorization app only在
  • 从 Intellisense 中隐藏(抽象)类

    我有几个抽象类是类库 想从 Intellisense 中隐藏 该怎么做 在类声明之前使用属性 Browsable false EditorBrowsable EditorBrowsableState Never edit 如果类代码在您的解
  • array[::-1] 的时间复杂度和空间复杂度是多少

    当在Python中反转列表时 我通常使用数组 1 进行反转 并且我知道更常见的方法可能是从列表的两侧进行交换 但我不确定这两种解决方案之间的区别 例如时间复杂度和空间复杂度 这两种方法的代码如下 def reverse array arra
  • 如何强制Delphi编译器显示所有提示和警告

    有没有办法强制Delphi编译器一直显示所有提示和警告 这是我目前在 Delphi 6 中看到的行为 从源代码管理中查看我的应用程序的最新副本 在Delphi中打开项目并编译 显示项目的所有提示和警告 更改一个单位 Compile 仅显示更
  • 图像交换按钮(Jquery)

    我有一个按钮 当单击它时 我想用图像替换该按钮 我怎样才能在 JQuery 中做到这一点 是否也可以替换图像的背景 按钮本身位于一个大 div 内 我不想在按钮周围添加另一个 div 因为它会弄乱以前的布局 如果你想替换按钮元素 the b
  • 在java中验证时间戳格式yyyy-MM-dd'T'HH:mm:ssZ?

    我正在尝试做一个时间戳验证使用乔达时间 1 6 2 请指出我的错误并帮助我 Code String timestamp 2014 09 23T23 03 11Z String datePattern yyyy MM dd T HH mm s
  • CreateProcess error=2 从 Ant 运行 javadoc

    谁能告诉我为什么会收到此错误消息 Buildfile C Users Tara workspace Testing build xml doc delete Deleting directory C Users Tara workspace
  • OS X 蓝牙编程

    我想创建 OS X 应用程序以通过蓝牙与 Lego Mindstorms NXT 2 0 配合使用 我尝试用 Objective C 和 Python 来实现 但是两者都存在一些问题 关于目标 C 我只发现this https develo
  • 如何在 R 中将多个文件 read.table() 放入单个表中?

    我有名为
  • nodejs mysql 错误:连接丢失 服务器关闭了连接

    当我使用node mysql时 在12 00到2 00之间出现错误 TCP连接被服务器关闭 这是完整的消息 Error Connection lost The server closed the connection at Protocol
  • 如何始终显示滚动条

    滚动视图中的滚动条仅在我开始滚动时才可见 我怎样才能始终显示它 目前最好的方法是使用android fadeScrollbars false 在 xml 中相当于ScrollView setScrollbarFadingEnabled fa
  • 如何获取 woocommerce 的所有产品?

    我已经建立了 Woo Commerce 其中有 1000 多种产品 使用 Woocommerce Rest api php 库我试图获取所有产品 但它给了我 10 个产品 如果我使用filter limit 它会给我大约 400 个产品 但
  • 验证失败/正常时禁用/启用 h:commandButton

    我有一个带有验证器和命令按钮的文本框 当文本框验证失败时 我想禁用命令按钮 否则应该启用它 我不想使用任何代码隐藏 因此它应该在 bean 中没有任何辅助属性的情况下工作 那么我如何根据验证器状态告诉命令按钮被禁用 启用
  • jQuery Mousemove:5px 变化时触发

    出于多种技术原因 我在 jQuery 上实现自己的 可拖动 功能 而不是使用 jQuery UI 并且我使用 mousedown 和 mousemove 事件来侦听尝试拖动元素的用户 到目前为止效果很好 我只是想每移动 5 像素 而不是逐像
  • 制作带有源子目录的文件

    我最新的项目是用 C 编写的 我使用的是 GNU Make 项目目录布局如下 project src subdir1 subdir2 containing tests doc bin 我希望能够致电make在顶级目录中 即项目目录中需要一个
  • 在 Java 中使用 lambda 表达式有运行时优势吗? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在阅读一些关于 Java 8 中提供的 lambda 表达式的博客和答案 我无法弄清楚单位 lambda 表达式是否有任何运行时优势 我