`

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闭包练习

    Java闭包是一个重要的编程概念,尤其在Java 8及以后的版本中得到了广泛的应用。闭包是一种函数式编程特性,允许函数保留对外部环境的引用,即使该函数被作为独立实体传递或执行。在Java中,接口中的默认方法和Lambda...

    传递闭包warshall算法java实现

    传递闭包是图论中的一个重要概念,特别是在研究有向图的可达性问题时。Warshall算法是由美国计算机科学家Stephen Warshall于1962年提出的,它主要用于计算有向图的所有节点对之间的传递闭包。在图中,如果存在一条从...

    闭包搜索算法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 8 及以后的版本中,闭包的实现主要通过 Lambda 表达式和默认方法来体现。 Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简洁的方式来表示没有名字的函数。Lambda 表达式的语法如下: `...

    Java中的闭包与回调.rar

    Java中的闭包与回调是编程领域中的两个重要概念,尤其在Java这门广泛使用的编程语言中,它们在函数式编程和异步处理中扮演着关键角色。本文将深入探讨这两个概念,以及它们如何在实际开发中应用。 首先,让我们来...

    离散数学的各种闭包运算

    7. **有界面的Java编程**:在实际应用中,我们可能会编写Java程序来实现这些闭包运算,并提供用户界面进行交互。这可能涉及到图形用户界面(GUI)的开发,如Swing或JavaFX,用户可以输入关系矩阵,程序计算并显示...

    Java中闭包简单代码示例

    Java中闭包简单代码示例 在 Java 中,闭包是一个非常重要的概念,它允许开发者在函数中捕捉和保存变量的值,从而实现代码的复用和模块化。在本文中,我们将通过一个简单的示例代码,来了解 Java 中闭包的定义和应用...

    山东大学三元闭包实验

    3. 闭包操作:通过迭代算法,找到所有可能的三元组,直到没有新的三元组可以添加到闭包中,这通常涉及到递归或动态规划方法。 4. 结果可视化:最后,可能还需要将结果可视化,例如绘制网络图,以直观地展示三元闭包...

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

    闭包和回调是Java编程中的两个重要概念,它们在处理函数式编程和事件驱动编程时起着关键作用。 首先,让我们来理解闭包。在Java中,闭包是一种能够访问和修改其封闭作用域(创建它的环境)变量的能力的函数或代码块...

    Recursive:Java 8 的递归闭包

    在Java 8中,递归和闭包是两个重要的概念,它们在函数式编程中扮演着核心角色。本文将深入探讨这两个概念,并结合实际示例解释它们如何在Java 8中协同工作。 首先,让我们理解“递归”。递归是一种算法,其中函数或...

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

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

    Java中的闭包与回调

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

    closure闭包

    在Java中,你可以使用Lambda表达式或匿名内部类来创建闭包,而在JavaScript中,所有的函数都是闭包。在C#中,可以使用`Action`、`Func`等委托类型或`lambda`表达式来创建闭包。 总的来说,闭包在编程中扮演着至关...

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

    Java函数式编程中的闭包是一种强大的工具,它允许函数访问并操作其定义时的作用域内的变量,即使该函数被传递到其他上下文中。在描述的示例中,我们看到闭包是如何帮助消除代码冗余的。 当我们需要创建多个类似的...

    传递闭包实现

    根据给定文件的信息,我们可以深入探讨“传递闭包”的概念及其在计算机科学中的实现方法。 ### 传递闭包的概念 传递闭包(Transitive Closure)是集合论中的一个概念,指的是在集合\(X\)上的一类特殊的二元关系。...

    Java中使用Groovy的三种方式

    在Java开发中,Groovy是一种强大的、动态类型的脚本语言,它可以无缝地与Java代码集成,为开发者提供了更简洁、灵活的语法。本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。...

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

    3. **迭代计算闭包:** 对于每一个函数依赖,检查其左侧是否全部包含在当前闭包中,如果是,则将该函数依赖的右侧加入到闭包中,并检查闭包是否发生变化。如果发生变化,则继续迭代计算,直到闭包不再增长为止。 **...

    跨越边界:闭包

    然而,对于某些社区,如Java,闭包的引入引发了一些争议。一些开发者认为闭包增加了语言的复杂性,破坏了简洁性,而另一些人则相信它们能带来新的设计模式和效率提升。 闭包的核心在于它可以捕获和存储其定义时的...

    22.1、闭包1

    闭包在编程中是一个重要的概念,特别是在Java这样的面向对象语言中。闭包允许我们将一个方法作为变量存储,并且这个方法可以访问它所在作用域内的变量,即使这些变量在其定义的函数或类之外。这种特性使得闭包在处理...

Global site tag (gtag.js) - Google Analytics