为什么Java Lambda也称为闭包
这个问题在这里已经有了答案:
这些是在相同的背景下经常提到的两个不同的术语。
拉姆达基本上只是一个匿名函数。 例如:( () -> System.out.println("Hello")
。 这是一个功能,但它没有名称。
封闭是关于范围界定的术语。 例如,在lambda中引用一个局部变量时,如下所示
int localInt = 17;
saveThisFunction(() -> System.out.println(localInt));
你创建一个闭包来捕获localInt
内的localInt
。 在文本上看起来很明显,在lambda表达式中访问localInt
应该localInt
,但请记住,lambda表达式可以在localInt
从堆栈中弹出后长时间存储和调用。
所以,创建一个lambda表达式通常需要创建一个闭包(隐式地)。
从技术上讲,这是错误的,lambda表达式和闭包是两个稍微不同的东西。
Lambdas是匿名函数,在Java世界中采用匿名单一方法类的形式(另请参阅函数接口):
Runnable r1 = () -> System.out.println("I'm Runnable");
闭包是lambda表达式的特定子类型,其中局部变量已绑定到特定封闭环境中定义的变量。
在Java世界中,你只是从这里写下类似于这个例子的东西:
final int x = 99;
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x);
System.out.println("y = " + y);
};
关于闭包的更完整的抽象定义:
在操作上,闭包是一个存储函数和环境的数据结构:将函数的每个自由变量( 在本地使用但在封闭作用域中定义的变量 )与该名称绑定的值或存储位置相关联的映射在关闭时创建。
闭包(与普通函数不同)允许函数通过闭包的引用访问那些捕获的变量,即使该函数是在其范围外调用的。
资源
最后一部分意味着你可以这样做:
public class Funct{
public static Consumer<Integer> getThatClosure(){
final int x = 99;
Consumer<Integer> myConsumer = (y) ->
{
System.out.println("x = " + x);
System.out.println("y = " + y);
};
return myConsumer;
}
public static void main(String... args){
Consumer<Integer> cons=getThatClosure();
cons.accept(0);
}
}
有了这个输出:
x=99
y=0
仅仅因为这些术语是相同的(我认为以及“匿名函数”),这就是在不同语言中调用类似的机制的方式,例如Groovy已经关闭了
顺便说一句,我不认为这是正确的问题
链接地址: http://www.djcxy.com/p/51271.html