我在c ++和Java上下文中对lambda表达式的解释是否正确?
答案 0 :(得分:5)
它们并不完全相同。两者都创建了未命名的类,但它们的相似性在那时结束。
在C ++中,您可以创建一个捕获局部变量的闭包,可选择通过引用。在Java中,您只需获取当前局部变量值的快照(这些变量必须是“最终”)。
匿名内部类的目的是扩展另一个类或实现另一个ad-hoc接口。因此,匿名内部类可以在某种程度上模拟lambda表达式的工作,例如通过实现Runnable
接口。 Lambda表达式专门设计用于调用,并可能修改其环境中的局部变量。
答案 1 :(得分:5)
Java匿名内部类可以引用封闭方法中的final
数据,以及封闭类中的所有数据(包括可变)。因此,匿名类中的方法不能更改封闭方法中变量的值,但它们可以更改封闭类中成员的值。
C ++ lambda可以引用封闭函数中的所有数据(包括mutable),如果它嵌套在成员函数中,那么它可以对封闭类的数据执行相同的操作。程序员声明了对封闭范围的精确依赖程度,因此它是显式的而不是隐式的。
这使它们非常相似,但Java特性以不同的方式处理方法中的局部变量/参数,原则是它们不应该在方法之外是可变的,特别是在传统上如此随意地使用线程的语言中。
与C#lambdas比较,它没有任何限制,所有依赖都是隐式的。这使得它们成为迄今为止最简单的这些特征(也有助于它们具有最佳的类型推断)。但是在缺点方面,它们使所有关于线程的简单规则无效,即局部变量“在线程堆栈上”不再是必然的,因此在访问之前永远不需要锁定。
答案 2 :(得分:2)
C ++ 0x lambda表达式是未命名方法,Javas匿名类是未命名类。所以他们没有名字,但概念不同。
从最明显的事实开始,lambda函数(可能)返回一个值,匿名类可用于创建实例(对象)。
BTW - wikipedia提到,对于C ++ 0x,建议只使用lambda 函数。