是Java 8封真正一流的价值还是仅仅是一个语法糖?
Answer 1:
我要说的是,Java的8封(“lambda表达式”)既不是纯粹的语法糖,也不是一流的值。
我一直在处理的语法糖的问题回答另一个问题StackExchange。
至于lambda表达式是否是“一流”这真的取决于你的定义,但我会作出这样的lambda表达式都算不上一流的情形。
从某种意义上说拉姆达想成为一个功能,但Java 8中不添加函数类型。 取而代之的是,一个lambda表达式被转换成一功能性的接口的实例。 这使得lambda表达式被添加到Java 8只有轻微的变化到Java的类型系统。 转换之后,结果是一样的是任何其它参考类型的引用。 事实上,使用Lambda - 例如,在已传递lambda表达式作为参数的方法 - 是从调用通过接口的方法没有区别。 接收功能接口类型的参数的方法,无法告诉它是否被传递lambda表达式或者一些类发生这种情况为执行该功能的接口的实例。
有关lambda表达式是否对象的详细信息,请参阅LAMBDA常见问题解答了这个问题。
鉴于lambda表达式转换为对象,它们继承(字面)对象的所有特性。 特别是,对象:
- 有不同的方法,如
equals
,getClass
,hashCode
,notify
,toString
,并wait
- 有身份的散列码
- 可以通过一个锁定
synchronized
块 - 可以使用进行比较
==
和!=
和instanceof
运算符
等等。 事实上,所有的这些都是无关的lambda表达式的使用目的。 他们的行为本质上是不确定的。 你可以写任何使用这些程序时,你会得到一些结果,但结果可能会因版本不同(甚至运行运行!)。
重申这更简洁,在Java中,对象是有身份的 ,但价值(特别是函数值,如果他们存在)不应该有任何身份概念。 Java的8不具备的功能类型。 相反,lambda表达式转换为对象,所以他们有很多的行李这是无关的功能,特别是身份。 这似乎并不像“一流”给我。
更新2013年10月24日
我一直在进一步对这个话题由于具有贴我的回答几个月前的思想。 从技术角度来看一切我上面写的是正确的。 得出的结论是可能表达更精确地与Java 8个Lambda表达式不是纯粹的 (相对于第一级 )的值,因为他们随身携带了很多行李的对象的。 然而,仅仅因为他们是不纯的,并不意味着他们没有一流的。 考虑维基百科的定义,一流的功能。 简言之,对于考虑功能一流所列的标准是能力:
- 函数作为参数传递给其他函数
- 返回从其他函数的函数
- 功能分配给变量
- 在数据结构存储功能
- 有的职能匿名
Java的8 lambda表达式满足所有这些标准。 所以这确实让它们看起来一流。
文章还提到了函数名没有特殊的地位,而不是函数的名称就是一个变量,其类型为函数类型。 Java的8 lambda表达式不符合这一最后一个标准。 Java的8不具备的功能类型; 它具有功能接口。 这些都有效地使用像函数类型,但它们不能工作类型。 如果你有一个类型为功能接口的引用,你不知道它是否是一个lambda,匿名内部类的一个实例,或者碰巧实现该接口的具体类的实例。
总之,Java的8 lambda表达式比我原本以为更有一流的功能。 他们只是没有纯粹的一流功能。
Answer 2:
是的 ,他们是第一类值(或将是,一旦Java的8发布...)
在你可以将它们作为参数,撰写他们做出更高阶的功能,将它们存储在数据结构等的意义,您将能够使用它们广泛的函数式编程技术。
也看到了什么“一流”,在这种情况下意味着多一点的定义:
- http://en.wikipedia.org/wiki/First-class_citizen
Answer 3:
正如我看到它,它是语法糖,但除了与类型推断,一个新的包java.util.functions
和语义内部类的它似乎作为第一级值。
Answer 4:
与变量绑定到外部上下文中的真正的封盖具有一些开销。 我会考虑的Java 8最优的实施,足够纯的。
这是不是至少不仅仅是语法糖。
我不知道任何更优化的实现。
Answer 5:
对我来说,lambda表达式在Java中8只是语法糖 ,因为你不能把它作为头等公民( http://en.wikipedia.org/wiki/First-class_function )的每一个应该被包装成对象时,它强加给比较多的时候限制语言,比如Scala纯头等功能。 Java的8封只能捕获不可变的(“有效终”)非本地变量。
这是更好的解释为什么它是语法糖的Java lambda表达式和闭包