Stu*_*rks 59
我会说Java 8闭包("Lambdas")既不仅仅是语法糖,也不是一流的价值观.
我在回答另一个StackExchange问题时已经解决了语法糖的问题.
至于lambdas是否是"头等舱",它实际上取决于你的定义,但我会说一个lambdas不是真正的头等舱.
在某种意义上,lambda想成为一个函数,但Java 8并没有添加函数类型.相反,lambda表达式被转换为功能接口的实例.这允许将lambda添加到Java 8中,只需对Java的类型系统进行微小的更改.转换后,结果就像任何其他引用类型的引用一样.实际上,使用Lambda(例如,在传递lambda表达式作为参数的方法中)与通过接口调用方法无法区分.接收函数接口类型的参数的方法无法判断它是否传递了lambda表达式或某个类的实例,这些类恰好实现了该功能接口.
有关lambda是否为对象的更多信息,请参阅Lambda FAQ回答此问题.
鉴于lambda被转换为对象,它们(字面上)继承了对象的所有特征.特别是对象:
equals,getClass,hashCode,notify,toString,和waitsynchronized块锁定==和!=与instanceof运营商等等.事实上,所有这些都与 lambda的预期用法无关.他们的行为基本上是未定义的.您可以编写一个使用其中任何一个的程序,您将得到一些结果,但结果可能因发行版本而异(甚至可以运行!).
更简洁地重申这一点,在Java中,对象具有身份,但是值(特别是函数值,如果它们存在的话)不应该具有任何身份概念.Java 8没有函数类型.相反,lambda表达式被转换为对象,因此它们有很多与功能无关的包袱,特别是身份.这对我来说似乎不是"头等舱".
更新2013-10-24
自从几个月前发布我的答案以来,我一直在思考这个话题.从技术角度来看,我上面写的所有内容都是正确的.结论可能更准确地表达为Java 8 lambdas不是纯粹的(而不是一等的)值,因为它们带有很多对象包袱.然而,仅仅因为它们不纯不意味着它们不是一流的.考虑维基百科对一流功能的定义.简而言之,那里列出的考虑职能一流的标准是能够:
Java 8 lambdas符合所有这些标准.所以这确实让他们看起来一流.
文章还提到了没有特殊状态的函数名称,而函数的名称只是一个类型为函数类型的变量.Java 8 lambdas不符合最后的标准.Java 8没有函数类型; 它有功能接口.它们像函数类型一样有效地使用,但它们根本不是函数类型.如果你有一个类型是函数接口的引用,你不知道它是lambda,匿名内部类的实例,还是碰巧实现该接口的具体类的实例.
总之,Java 8 lambdas比我原先想象的更加一流.它们不仅仅是纯粹的一流功能.
是的,它们是一流的价值(或者,一旦Java 8发布......)
在某种意义上,您可以将它们作为参数传递,将它们组合成更高阶函数,将它们存储在数据结构中等等.您将能够将它们用于广泛的函数编程技术.
另请参阅更多关于"第一类"在此上下文中的含义的定义:
| 归档时间: |
|
| 查看次数: |
9919 次 |
| 最近记录: |