我目前正在浏览Java,并发现它也称为闭包。
请问有什么理由叫闭包吗?我想要一个技术性的解释。
发布于 2015-03-17 13:36:46
这是两个不同的术语,在相同的背景下经常被提到。
() -> System.out.println("Hello").这是一个函数,但它没有名字。localInt。从文本上看,显然访问lambda中的localInt应该是可以的,但请记住,可以在localInt从堆栈中弹出很长时间后存储和调用lambda。因此,创建lambda表达式通常需要创建闭包(隐式)。
发布于 2015-03-17 13:40:09
从技术上讲,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发布于 2015-03-17 13:36:59
仅仅因为这些术语是等价的(我认为还有“匿名函数”),这就是在不同语言中调用类似机制的方式,例如Groovy有闭包。
顺便说一句,我觉得这样问是不对的
https://stackoverflow.com/questions/29100472
复制相似问题