首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Java也称为闭包

为什么Java也称为闭包
EN

Stack Overflow用户
提问于 2015-03-17 13:34:17
回答 3查看 2.1K关注 0票数 9

我目前正在浏览Java,并发现它也称为闭包。

请问有什么理由叫闭包吗?我想要一个技术性的解释。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-17 13:36:46

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

  • lambda基本上只是一个匿名函数。例子:() -> System.out.println("Hello").这是一个函数,但它没有名字。
  • 闭包是一个关于作用域的术语。例如,当引用lambda中的局部变量时,如下所示 int localInt = 17;saveThisFunction(() -> System.out.println(localInt)); 创建一个闭包来捕获lambda中的localInt。从文本上看,显然访问lambda中的localInt应该是可以的,但请记住,可以在localInt从堆栈中弹出很长时间后存储和调用lambda。

因此,创建lambda表达式通常需要创建闭包(隐式)。

票数 18
EN

Stack Overflow用户

发布于 2015-03-17 13:40:09

从技术上讲,lambda表达式和闭包是两个略有不同的东西,这是错误的。

Lambdas是匿名函数,在Java中采用匿名的单一方法类的形式(参见功能接口):

代码语言:javascript
运行
复制
Runnable r1 = () -> System.out.println("I'm Runnable");

闭包是lambda表达式的一个特定的子类型,其中局部变量被绑定到在特定的封闭环境中定义的变量。

在Java世界中,您只是在从这里编写类似于这个示例的东西。

代码语言:javascript
运行
复制
final int x = 99;
        
Consumer<Integer> myConsumer = (y) -> 
{
    System.out.println("x = " + x);
    System.out.println("y = " + y);
};

对于更完整的闭包的抽象定义:

在操作上,闭包是存储函数和环境的数据结构:一个映射将函数的每个空闲变量(本地使用但在封闭作用域中定义的变量)与名称在创建闭包时绑定到的值或存储位置相关联。 闭包--不像普通函数--允许函数通过闭包对它们的引用访问这些捕获的变量,即使函数在其作用域之外被调用。

来源

最后一部分意味着你可以这样做:

代码语言:javascript
运行
复制
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);
    }

} 

有了这个输出:

代码语言:javascript
运行
复制
x=99
y=0
票数 4
EN

Stack Overflow用户

发布于 2015-03-17 13:36:59

仅仅因为这些术语是等价的(我认为还有“匿名函数”),这就是在不同语言中调用类似机制的方式,例如Groovy有闭包。

顺便说一句,我觉得这样问是不对的

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29100472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档