Java7要支持closure了?

 

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

public   static   void  main(String[] args){
    
int  plus2( int  x){  return  x + 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  =  ( int  x) { return  x + 2 ; };

或者这样:

int ( int ) plus2b  =  ( int  x): 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。。。在改进语言方面,不得不说微软的动作很快。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值