`
步行者
  • 浏览: 171378 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA 需要引入闭包吗

    博客分类:
  • JAVA
阅读更多

最近有很多人 呼吁 要在JAVA的新版本中引入闭包。

那么JAVA 或者说 OOPL (面向对象编程语言)需要引入闭包吗,有了对象还需要闭包吗?

 

收先先了解一下什么是闭包,


    闭包   是可以包含自由(未绑定)变量 的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。

    可能上面的定义有点晦涩,下面看一下《Python 核心编程》 对 闭包 的解释。

    如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被定义为闭包 。定义在外部函数内的但由内部函数引用或者使用的变量被称为自由变量

 

下面是一个闭包的例子 (由于JAVA现在不支持闭包,这个闭包的例子是用Python写的,参见了《Python 核心编程》

 

def counter(start_at = 0):
    count = [start_at]
    def incr():
        count[0] += 1
        return count[0]
    return incr

 

这里面count变量 就是一个 相对于函数incr 的自由变量(它在 函数incr 的外部作用域上,但又不在全局作用域上),内部函数incr 可以引用和使用这个变量。这个例子主要模拟一个计数器。

运行下面的代码

 

count = counter(6)
print count()
print count()

 

就会打印出

 

    7

    8

 

我们发现 内部函数(incr)不但可以引用其自身定义的变量,还可以引用外部函数(counter)定义的变量。

或者说 内部函数(闭包) 可以记忆状态, 它可以根据 它记忆的状态 来执行不同的操作。 而外部函数 负责

初始化状态(内部函数需要记忆的状态)。

 

那么为什么需要闭包,闭包的优势是什么呢?

我觉得就是可以记忆状态

但对象也可以记忆状态(通过对象的属性)。

那闭包和对象的区别是什么呢?

我觉得 就因为 闭包是函数 而不是对象。

 

我们会发现,如果用面向对象的方式来表达闭包

内部函数(闭包)就像 对象的方法

而外部函数  对象的构造器。

构造器 用来 初始化对象状态

而 对象的方法可以根据 对象的状态 来执行不同的操作。

 

 

好! 下面我们用面向对象的方式 创建一个 计数器(实现和上例一样的功能,用JAVA实现)。

 

public class Counter {
	private int startAt;
	public Counter() {
		this(0);
	}
	public Counter(int startAt) {
		this.startAt = startAt;
	}
	public int incr(){
		return ++ this.startAt;
	}
}

 

 

 运行Test类

 

public class Test{
	public static void main(String[] args){
		Counter counter = new Counter(6);
		System.out.println(counter.incr());
		System.out.println(counter.incr());
	}
}

 

会打印出(和上例打印输出相同)

 

    7

    8

 

 

那么JAVA(有了对象)还需要引入闭包吗?

我觉得不需要,

因为对象完全可以模拟 闭包 的行为,

而且 对象 才是 OOP 的 一级元素。

闭包 是 函数式编程(FP) 中的 概念,

 引入闭包 就相当于 引入 FP,

这只会破坏 JAVA 的 纯粹 与 简单 。。

 

 

 

 

分享到:
评论
93 楼 ninini 2009-06-13  
这前面一大堆贴 怎么跟主题越来越不着边了
尤其 幸存者,和什么稀泥啊
92 楼 步行者 2009-06-12  
幸存者 写道

使用java真的都是自己选的吗?大部分用java的人恐怕还是因为学校和公司选了java。
我说这个本来也没什么特别的意思,只是因为前面有人说java第一宝座如何如何,所以表达一下不屑。


你有什么不屑,java是使用人数最多的编程语言 这是事实
91 楼 幸存者 2009-06-12  
icefishc 写道
幸存者 写道
laoshi 写道

自然语言和机器语言有多大可比性?
就自然语言而言,中文当然是最好的语言汉语的书写体系。
如果硬要用机器语言的观点来比较的话,也许只有已经死亡的拉丁语算是好语言吧。

注意,我比较的不是自然语言和编程语言,我比较的是说某种语言好的理由。
中文是否是最好的自然语言我不评价,但是拿用中文的人最多来证明中文是最好的自然语言不是无厘头吗?就像拿用Java的人最多来证明Java是最优秀的语言一样无厘头。


这个例子很是无厘头. 你使用java是你选择了java, 而你用中文这不是你能选的。  这个thread里没有人说“用Java的人最多所以java是最优秀的语言”  这东西和主题有什么关系么

使用java真的都是自己选的吗?大部分用java的人恐怕还是因为学校和公司选了java。
我说这个本来也没什么特别的意思,只是因为前面有人说java第一宝座如何如何,所以表达一下不屑。
90 楼 icefishc 2009-06-12  
幸存者 写道
laoshi 写道

自然语言和机器语言有多大可比性?
就自然语言而言,中文当然是最好的语言汉语的书写体系。
如果硬要用机器语言的观点来比较的话,也许只有已经死亡的拉丁语算是好语言吧。

注意,我比较的不是自然语言和编程语言,我比较的是说某种语言好的理由。
中文是否是最好的自然语言我不评价,但是拿用中文的人最多来证明中文是最好的自然语言不是无厘头吗?就像拿用Java的人最多来证明Java是最优秀的语言一样无厘头。


这个例子很是无厘头. 你使用java是你选择了java, 而你用中文这不是你能选的。  这个thread里没有人说“用Java的人最多所以java是最优秀的语言”  这东西和主题有什么关系么
89 楼 幸存者 2009-06-12  
laoshi 写道

自然语言和机器语言有多大可比性?
就自然语言而言,中文当然是最好的语言汉语的书写体系。
如果硬要用机器语言的观点来比较的话,也许只有已经死亡的拉丁语算是好语言吧。

注意,我比较的不是自然语言和编程语言,我比较的是说某种语言好的理由。
中文是否是最好的自然语言我不评价,但是拿用中文的人最多来证明中文是最好的自然语言不是无厘头吗?就像拿用Java的人最多来证明Java是最优秀的语言一样无厘头。
88 楼 laoshi 2009-06-12  
幸存者 写道
night_stalker 写道

大部分人考 60 分,所以 60 分最优秀么……

像Java这样的语言,除非改得面目全非,否则只能是积重难返了,估计连Sun自己都认识到这个问题了。

以用户人数的多寡来评价一种语言大概是最无厘头了。因为中国人最多,所以中文是世界上最好的语言?

自然语言和机器语言有多大可比性?
就自然语言而言,中文当然是最好的语言汉语的书写体系。
如果硬要用机器语言的观点来比较的话,也许只有已经死亡的拉丁语算是好语言吧。
87 楼 幸存者 2009-06-12  
night_stalker 写道

大部分人考 60 分,所以 60 分最优秀么……

像Java这样的语言,除非改得面目全非,否则只能是积重难返了,估计连Sun自己都认识到这个问题了。

以用户人数的多寡来评价一种语言大概是最无厘头了。因为中国人最多,所以中文是世界上最好的语言?
86 楼 night_stalker 2009-06-12  
步行者 写道
evabibi 写道


我发现楼主思维强势(自我).

引入的好处和坏处大家都知.
前语言排名前10只有java没有闭包 .
你能说他们都没有考虑过吗?



一定要拿OO来说事? 
不于让java去掉基础类型让java更OO.


没有坏的技术。只有被滥用的技术.


不是我思维强势,而是你没有说服我“引入闭包 Java 会更好”

语言排名前10只有java没有闭包 .
而没有闭包影响JAVA坐第一把交椅了吗
当然这不是讨论的重点

原始数据类型在Java的较早版本就以引入,为了效率
如果不是因为效率,估计也变成类了
“一定要拿OO来说事?  ”
用 java 而不用 OO 的思想编程,那你用什么?

“没有坏的技术。只有被滥用的技术.”
如果被大量滥用,那我就要怀疑它了



大部分人考 60 分,所以 60 分最优秀么……
85 楼 步行者 2009-06-12  
evabibi 写道


我发现楼主思维强势(自我).

引入的好处和坏处大家都知.
前语言排名前10只有java没有闭包 .
你能说他们都没有考虑过吗?



一定要拿OO来说事? 
不于让java去掉基础类型让java更OO.


没有坏的技术。只有被滥用的技术.


不是我思维强势,而是你没有说服我“引入闭包 Java 会更好”

语言排名前10只有java没有闭包 .
而没有闭包影响JAVA坐第一把交椅了吗
当然这不是讨论的重点

原始数据类型在Java的较早版本就以引入,为了效率
如果不是因为效率,估计也变成类了
“一定要拿OO来说事?  ”
用 java 而不用 OO 的思想编程,那你用什么?

“没有坏的技术。只有被滥用的技术.”
如果被大量滥用,那我就要怀疑它了

84 楼 evabibi 2009-06-12  
步行者 写道


因为闭包不OO所以不应该引入Java,这种理由不荒唐
这和 java 的特质有关,因为Java 一开始的设计就没打算
为 闭包(函数) 提供一个可扩展的空间,

因为 闭包不OO,
所以可能会让JAVA引入闭包 付出极大的代价
我感觉 这种代价会远远大于它的收益(当然,这仅仅是我的观点)



我发现楼主思维强势(自我).

引入的好处和坏处大家都知.
前语言排名前10只有java没有闭包 .
你能说他们都没有考虑过吗?



一定要拿OO来说事? 
不于让java去掉基础类型让java更OO.


没有坏的技术。只有被滥用的技术.
83 楼 ravenex 2009-06-12  
步行者 写道
回复上贴:
c 是 汇编吗,java 是 汇编吗
汇编被淘汰了吗(汇编有汇编的优势)
垃圾回收 这么好, 为什么 C++ 没有这方面的改进

java 也不是 ruby,Lisp
你怎么能 肯定 引入闭包 会让java 提高生产效率
引入闭包 的代价和收益 你权衡过吗。

正好楼主大大列举各种语言,C++也有闭包(了)。垃圾回收其实也有相应机制,shared_ptr<T>。内建于语言的GC被认为不够灵活而没有加入C++。
Java不是C++。

步行者 写道
至于为什么java一开始设计就没打算为闭包提供一个可扩展的空间?
上网搜 为什么在新版本中没有引入JAVA 的理由

上网搜到的是别人的观点,大伙儿期待的是楼主大大的观点啊。
82 楼 步行者 2009-06-12  
回复上贴:
这是你的观点,你的OO,我不做评述

至于为什么java一开始设计就没打算为闭包提供一个可扩展的空间?
上网搜 为什么在新版本中没有引入JAVA 的理由
81 楼 幸存者 2009-06-12  
步行者 写道
幸存者 写道
步行者 写道
回复上贴:
c 是 汇编吗,java 是 汇编吗
汇编被淘汰了吗(汇编有汇编的优势)
垃圾回收 这么好, 为什么 C++ 没有这方面的改进

java 也不是 ruby,Lisp
你怎么能 肯定 引入闭包 会让java 提高生产效率
引入闭包 的代价和收益 你权衡过吗。

我没有说过Java引入闭包一定好,我反对的是“因为闭包不OO所以不应该引入Java”这种荒唐的理由


因为闭包不OO所以不应该引入Java,这种理由不荒唐
这和 java 的特质有关,因为Java 一开始的设计就没打算
为 闭包(函数) 提供一个可扩展的空间,

因为 闭包不OO,
所以可能会让JAVA引入闭包 付出极大的代价
我感觉 这种代价会远远大于它的收益(当然,这仅仅是我的观点)

你甚至没有解释为什么闭包不OO,OO语言支持闭包的多了去了,没看出哪里不OO了。
你要是说,闭包不符合Java的OO,Java的OO就是不应该有闭包的OO,那我就没话好说了。不过哪种OO才是Java的OO?

另外你怎么知道java一开始设计就没打算为闭包提供一个可扩展的空间?支持闭包只需要改java编译器就可以了,jvm和bytecode都不需要动。
80 楼 步行者 2009-06-12  
幸存者 写道
步行者 写道
回复上贴:
c 是 汇编吗,java 是 汇编吗
汇编被淘汰了吗(汇编有汇编的优势)
垃圾回收 这么好, 为什么 C++ 没有这方面的改进

java 也不是 ruby,Lisp
你怎么能 肯定 引入闭包 会让java 提高生产效率
引入闭包 的代价和收益 你权衡过吗。

我没有说过Java引入闭包一定好,我反对的是“因为闭包不OO所以不应该引入Java”这种荒唐的理由


因为闭包不OO所以不应该引入Java,这种理由不荒唐
这和 java 的特质有关,因为Java 一开始的设计就没打算
为 闭包(函数) 提供一个可扩展的空间,

因为 闭包不OO,
所以可能会让JAVA引入闭包 付出极大的代价
我感觉 这种代价会远远大于它的收益(当然,这仅仅是我的观点)
79 楼 幸存者 2009-06-12  
步行者 写道
回复上贴:
c 是 汇编吗,java 是 汇编吗
汇编被淘汰了吗(汇编有汇编的优势)
垃圾回收 这么好, 为什么 C++ 没有这方面的改进

java 也不是 ruby,Lisp
你怎么能 肯定 引入闭包 会让java 提高生产效率
引入闭包 的代价和收益 你权衡过吗。

我没有说过Java引入闭包一定好,我反对的是“因为闭包不OO所以不应该引入Java”这种荒唐的理由
78 楼 步行者 2009-06-12  
回复上贴:
c 是 汇编吗,java 是 汇编吗
汇编被淘汰了吗(汇编有汇编的优势)
垃圾回收 这么好, 为什么 C++ 没有这方面的改进

java 也不是 ruby,Lisp
你怎么能 肯定 引入闭包 会让java 提高生产效率
引入闭包 的代价和收益 你权衡过吗。
77 楼 幸存者 2009-06-12  
步行者 写道
幸存者 写道
步行者 写道
幸存者 写道
步行者 写道

“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

那你能否解释一下为什么我们需要OO?
你不要回答:因为我们需要OO!


你还没回答我的问题啊。。?
“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

很简单,最终都可以归结到一点,为了提高生产力。


JAVA 引入闭包就一定能 提高生产率吗。?

当然可以,不过闭包在Java中的作用不算太明显,如果闭包结合一些其它FP特性如currying、匿名函数之类将更强大。
但是改进总是一步一步的,不然大家都用汇编好了,为什么需要C呢,为什么需要Java呢?
76 楼 步行者 2009-06-12  
幸存者 写道
步行者 写道
幸存者 写道
步行者 写道

“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

那你能否解释一下为什么我们需要OO?
你不要回答:因为我们需要OO!


你还没回答我的问题啊。。?
“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

很简单,最终都可以归结到一点,为了提高生产力。


JAVA 引入闭包就一定能 提高生产率吗。?
75 楼 幸存者 2009-06-12  
步行者 写道
幸存者 写道
步行者 写道

“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

那你能否解释一下为什么我们需要OO?
你不要回答:因为我们需要OO!


你还没回答我的问题啊。。?
“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

很简单,最终都可以归结到一点,为了提高生产力。
74 楼 步行者 2009-06-12  
幸存者 写道
步行者 写道

“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

那你能否解释一下为什么我们需要OO?
你不要回答:因为我们需要OO!


你还没回答我的问题啊。。?
“这就是典型的为了OO而OO,而且只是为了“所谓的OO”。”
不为了OO而OO,那为了什么。?

相关推荐

    Java闭包 Java闭包

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

    Java闭包练习

    在Java 8中,引入了Lambda表达式来简化匿名内部类的使用,从而更好地支持闭包。Lambda表达式可以被视为没有名字的方法,它可以捕获和存储它被定义时所在作用域内的变量值。这使得Lambda能够访问并修改其外部作用域的...

    Java中的闭包与回调.rar

    例如,在Java 8引入的Lambda表达式中,闭包的概念尤为明显。Lambda表达式可以看作是一个没有名字的函数,它可以捕获其周围(也称为词法环境)的变量,并在需要时使用它们。以下是一个简单的示例: ```java public ...

    详解Java的闭包

    Lambda 表达式是 Java 8 引入的一项重要特性,它提供了一种简洁的方式来表示没有名字的函数。Lambda 表达式的语法如下: `(parameters) -&gt; expression` 这里,`parameters` 是输入参数列表,`expression` 是函数体...

    Recursive:Java 8 的递归闭包

    在Java 8之前,Java不支持真正的闭包,但引入了Lambda表达式后,它实现了类似的功能。闭包是一种可以访问和修改其定义范围内的变量,即使在该作用域外部执行时也是如此。这主要是通过匿名内部类实现的,但在Java 8中...

    跨越边界:闭包

    闭包是一种强大的编程概念,它允许函数访问和操作其外部作用域中的变量,即使在函数执行完毕后仍然...因此,对于是否应该在编程语言中引入闭包,取决于开发者对复杂性与功能性的权衡,以及对语言设计理念的理解和偏好。

    Java中使用Groovy的三种方式

    Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。Groovy可以作为这种嵌入式脚本语言使用。通过`groovy.lang.GroovyShell`或`groovy.lang.GroovyScriptEngine`,你可以...

    Java in easy steps Covers Java 9 6th Edition

    Java是一种广泛使用的面向对象编程语言,它从Java 8版本开始引入了Lambda表达式和流(Streams),从而增强了Java的函数式编程特性。《Java in easy steps》涵盖了Java 9,并特别针对Java 8的新特性进行了详细讲解。...

    java入门笔记.pdf

    文档还介绍了设计模式,如单例模式,以及Java中的闭包、内部类、异常处理、抽象类与接口等高级特性。 ### Java多线程 Java多线程部分详细解释了如何创建和管理线程、线程池的使用、volatile关键字、死锁、线程通信...

    Java 8 Nashorn 脚本引擎

    Nashorn引擎首次引入于Java 8,作为对之前Rhino JavaScript引擎的升级,旨在提供更快的速度和更现代的JS语法支持。 Nashorn引擎的主要特性包括: 1. **高性能**:Nashorn比Rhino更快,因为它基于Java的HotSpot...

    OnJava8-Examples-master.zip

    7. **函数式编程概念**:Java 8鼓励函数式编程风格,如使用高阶函数和闭包。这些特性使得Java更适合并行处理和大数据处理场景。 8. **并行流(Parallel Stream)**:Java 8的Stream API支持并行流,可以自动利用多核...

    JAVA JAVA JAVA JAVA

    - **闭包**:闭包允许函数访问和修改其外部词法作用域的变量,即使在其外部函数已经执行完毕后。 - **异步编程**:JavaScript通过回调函数、Promise和async/await来处理异步操作,如Ajax请求和定时器。 - **DOM操作*...

    Java SE 8的55个新特性

    这使得Java支持了闭包和函数式编程的概念。Lambda表达式为Java提供了匿名函数类型,可以用来简化接口的实现,并在函数式接口上使用,极大地提高了编程的灵活性和效率。 另外,Java SE 8通过扩展方法(也称为默认...

    Functional Interfaces in Java.pdf

    近年来,随着函数式编程概念的普及和Java 8的发布,Java引入了“函数式接口”的概念,给Java的接口设计带来了全新的变革。函数式接口是指那些只定义了一个抽象方法的接口,允许通过lambda表达式来实现更简洁的代码,...

    beyond java

    5. **闭包和块**:Ruby的块和闭包是强大的功能,允许在函数内部定义局部作用域的代码块,可作为参数传递,这在Java 8之后才引入类似的概念(Lambda表达式)。 6. **并发模型**:Java使用线程进行并发处理,而Ruby...

    java html 所有帮助文档

    Java帮助文档,通常被称为Java API文档,包含了Java平台标准版(Java SE)、企业版(Java EE)和微服务版(Java ME)的所有类、接口、方法和异常的详细信息。这些文档是开发者日常编码时的重要参考资料,能够帮助...

    java语言的发展

    Java7于2010年9月预览,2011年7月正式发布,引入了闭包等新特性,增强了语言的表达能力和并发处理能力。这些更新展示了Java持续创新和适应技术变革的决心。 Java的发展历程充分体现了其适应性和灵活性,从最初的...

    java lambda入门到高级代码实例

    Java Lambda 是一种强大的语法特性,它在 Java 8 中被引入,使得函数式编程成为可能。Lambda 表达式简化了处理匿名函数的方式,让代码更简洁、易读。在这个"java lambda入门到高级代码实例"中,我们将深入探讨Lambda...

    Java Groovy

    - **兼容性**:Groovy不仅支持Java类库,还能直接调用Java代码,这为开发者提供了一种在不改变现有Java环境的情况下引入新特性的途径。 - **灵活性**:Groovy支持元编程系统(MPS)和运行时注入(RTI),使得...

Global site tag (gtag.js) - Google Analytics