Java7要支持closure了?

当然,不是代数里那个针对操作的closure,而是函数编程里的closure。这里是提议的PDF。从PDF来看,Java准备支持通行的lexical scoped closure。也就是说,一个函数对象读取的自由变量必须由源代码的结构决定。看例子吧:

publicstaticvoidmain(String[]args){intplus2(intx){returnx+2;}int(int)plus2b=plus2;System.out.println(plus2b(2));}

这段 int plus2(int x){return x+2;} 就定义了一个叫plus2的函数。它接受一个整数参数,返回一个整数。下一句int(int) plus2b = plus2; 申明了一个函数变量(引用类型),plus2b,然后把它指向plus2指代的函数。int(int)是函数变量的类型,标识带一个整数参数,返回一个整数参数。

对应的closure写法:

int(int)plus2b=(intx){returnx+2;};

或者这样:

int(int)plus2b=(intx):x+2

其实Java应该开始支持类型推断了(Type inference)。函数plus2已经有了类型信息,上面的句子完全可以完全

可以写成plus2b = plus2。大不了像C#3.0里那样,写成var plus2b = plus2,以便编译器有点明显的提示。

有老大会说,不过是句法糖。aynonymous class已经支持lexical scoped closure了。嗯,对也不对。Anonymous class是可以读取lexical scope内的自由变量,但这些变量必需是final。但新的Java closure确可以读取任何本地变量,包括函数参数(不然大家喜闻乐见的Curry怎么玩儿呢? )。一个字:酷!

当然,事情永远没有那么简单。这份提议还讨论了好些其它关键问题。比如说怎么和旧的代码兼容,怎么和anonymous class区分,怎么做类型转换,以及怎么支持泛型。有兴趣的去读PDF吧。

Java7里有了closure当然是好消息。至少我们不用听人唠叨Java是名词的王国了。Sun前两天说Java要支持更多的语言(包括VB.NET。怎么听起来像说.NET啊),更多的动态语言特性,看来不假。可惜要用到Java7得好几年以后去了。至少我所在的公司还在用1.4。当然了,用哪个版本取决于很多因素,语言本身的影响很小。不过这是另外的话题了。Sun的动作该加快乐。虽说.NET有后发优势,但这个世界就这么残酷:我们只看结果,不听理由。看看C#3.0里的新特性吧:扩展方法,lambda 表达(这个和Java里的closure是一样的), 新的initializier(难道你不喜欢s = [1,2, 3, 4]这样简洁的语法?), 匿名类型, LINQ。。。在改进语言方面,不得不说微软的动作很快。

没有伞的孩子必须努力奔跑!

Java7要支持closure了?

相关文章:

你感兴趣的文章:

标签云: