为什么Java Lambda也称为闭包

这个问题在这里已经有了答案:

  • '封'和'lambda'有什么区别? 10个答案

  • 这些是在相同的背景下经常提到的两个不同的术语。

  • 拉姆达基本上只是一个匿名函数。 例如:( () -> 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

    上一篇: Why is Java Lambda also called Closures

    下一篇: JavaScript closures vs. anonymous functions