`

java 中到底什么叫闭包

 
阅读更多
什么是闭包

  闭包的概念,不同资料给出了好几种。

  闭包:包含了自由(未绑定)变量的代码块,这些变量不是在这个代码块中或者任何全局上下文中定义的,而是定义代码块的环境中定义的。也就是下面两部分:

  要执行的代码块(由于自由变量存在,相关变量引用没有释放)
  为自由变量提供绑定的计算环境(作用域)

  闭包:一种函数对象或者匿名函数,作为参数传递,可以动态的创建与返回

  闭包:具有闭合作用域的匿名函数

  第一层理解:闭包是具有特别作用域规则且可以作为参数的代码块

3.times {puts "Inside the times method."}

Results:
Inside the times method.
Inside the times method.
Inside the times method.

  第二层理解:给上述的代码块扩展一个参数列表,使方法或函数可以与这个代码通讯

['lions', 'tigers', 'bears'].each {|item| puts item}

Results:
lions
tigers
bears

  第三层理解:将这样的代码块作为参数传递

animals = ['lions', 'tigers', 'bears'].collect {|item| item.upcase}
puts animals.join(" and ") + " oh, my."

LIONS and TIGERS and BEARS oh, my.

  第四层理解:定义代码块的环境的名称空间和使用它的函数之间的作用域本质上是一个作用域,即:作用域是闭合的

tax = 0.08
prices = [4.45, 6.34, 3.78]
tax_table = prices.collect {|price| {:price => price, :tax => price * tax}}
tax_table.collect {|item| puts "Price: #{item[:price]} Tax: #{item[:tax]}"}

Results:
Price: 4.45 Tax: 0.356
Price: 6.34 Tax: 0.5072
Price: 3.78 Tax: 0.3024

  按照SCIP定义:闭包就是一个携带有本地状态的函数

  我对闭包的理解

  闭包具有函数的性质
   能完成一定的功能的代码块
   能够预定义参数和引用作用域中的参数
   能够在需要的地方被调用

  闭包可以看成对象
   能够作为参数传递

  作用域的作用
   作用域设定一个运行空间,但是作用域本身也很无赖,作用域知道自己能干什么,但是不知道具体要怎么做。只要作用域真正要用的时候,见到了闭包里面的代码块,作用域才算功德圆满了。这就是所谓“动态”的一种体现吧
   作用域决定了闭包中代码块的使用方法
   作用域决定了闭包中预设参数的本质,如参数的个数,类型

  疑问:还没有搞清楚一个问题,在这里请教一下知道的

  在闭包里面作用域提供的参数 是怎么和闭包里面预设的参数一一对应起来的呢?见下面代码

printMapClosure = {| key, value| puts key + "=" + value }
[ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)
result:yue=wu
lane=burks
sudha=saseethiaseeleethialeselan
 
  我想知道为什么 key就对应yue,lane,sudha呢?而value就会对应wu,burks,sasee...呢?

  作用域决定了闭包的最终处理结果

  总结:闭包是一种被作用域限制的函数对象

  另附:未来Java可能会采用的两种闭包形式

  BGGA方案

  说明:扩展了类型系统,引入了 function 类型,即函数都带有一个类型参数列表、返回类型和 throws 子句。

代码:完成求平方和
sumOfSquares = mapReduce(myBigCollection,
{ Double x => x * x },
{ Double x, Double y => x + y });

CICE方案
说明:通过定义更简化的内部类来完成对闭包的支持

代码:完成求平方和
Double sumOfSquares = mapReduce(myBigCollection,
UnaryFunction<Double>(Double x) { return x*x; },
BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });
分享到:
评论

相关推荐

    Java闭包 Java闭包

    JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...

    闭包搜索算法java编程

    It is important in distributed computer systems to identify those events (at identifiable points in time) that are concurrent, or not related to each other in time. A group of concurrent events may ...

    详解Java的闭包

    主要介绍了详解Java的闭包,作者从Lambda和默认方法等重要特性深入讲解,极力推荐!需要的朋友可以参考下

    Java中的闭包与回调.rar

    Java中的闭包与回调.rar

    Java闭包练习

    Java8 Java7 练手 类似于SessionTemplate

    Java内部类之间的闭包和回调详解

    相信闭包和回调对每位学习Java的人来说都不陌生,那么今天小编和大家分享一篇关于Java内部类之间的闭包和回调,有需要的可以参考借鉴。

    离散数学的各种闭包运算

    离散数学 闭包运算 传递闭包 自反闭包 对称闭包 warshell算法 普通算法 有界面 java编程

    传递闭包warshall算法java实现

    传递闭包的Warshall算法,java实现

    什么是闭包?闭包的优缺点?

    什么是闭包?闭包的优缺点?

    Java中的闭包与回调

    闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境...支持闭包的多数语言都将函数作为第一级对象,是说这些函数可以存储到变量中、作为参数传递

    Java中闭包简单代码示例

    主要介绍了Java中闭包简单代码示例,具有一定借鉴价值,需要的朋友可以参考下

    Recursive:Java 8 的递归闭包

    递归Java 8 的递归闭包基于stackoverflow上的这个答案: : 包含一个简单的用法演示。 查看我的另一个函数式编程项目: : 博客条目: :

    山东大学三元闭包实验

    自己码的代码,R语言实现,

    Java函数式编程(五):闭包

    主要介绍了Java函数式编程(五):闭包,本文是系列文章的第5篇,其它篇章请参阅相关文章,需要的朋友可以参考下

    跨越边界:闭包

    一些人认为闭包带给编程语言的...尽管一些颇具竞争力的语言(如 C#)采纳了闭包,但Java社区至今仍抵制对它的使用。本文探讨闭包在为编程语言带来一点点便利的同时是否也带来不必要的复杂性、闭包还有无更多的益处。

    JavaSript中变量的作用域闭包的深入理解

    闭包:函数内部可以调用函数外部的变量;反之,则不行 */ var r=10; function test1(){ var r2=”abc”; //alert(r) } //alert(r2);//不能访问的函数内部的r2 test1(); //嵌套的函数中也ok啦 function

    javascript中的return和闭包函数浅析

    这跟闭包本身没什么大的关系,也不知道怎么取标题,随便凑了个数,望见谅!今天一个刚学js的朋友给了我一段代码问为什么方法不执行,代码如下: 代码如下:function makefunc(x) { return function (){ return x;...

    求属性集的闭包和求候选键的2个算法(JAVA实现).doc

    求属性集的闭包和求候选键的2个算法(JAVA实现).doc

    理解javascript中的闭包

    什么是闭包? 闭包的特性 闭包的作用: 闭包的代码示例 注意事项 总结 闭包在javascript来说是比较重要的概念,平时工作中也是用的比较多的一项技术。下来对其进行一个小小的总结 什么是闭包? 官方说法: ...

    疯狂JAVA讲义

    学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...

Global site tag (gtag.js) - Google Analytics