我正在阅读一些关于 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(使用前将#替换为@)