它们并不完全相同.两者都创建了未命名的类,但它们的相似性在此时结束.
在C++中,您可以创建一个捕获局部变量的闭包,可选择通过引用.在Java中,您只需获取当前局部变量值的快照(这些变量必须是"最终").
匿名内部类的目的是扩展另一个类或实现另一个ad-hoc接口.因此,匿名内部类可以在某种程度上模拟lambda表达式的作业,例如通过实现Runnable接口.Lambda表达式专门设计用于调用,并可能修改其环境中的局部变量.
Java匿名内部类可以引用final封闭方法中的数据,以及封闭类中的所有数据(包括可变).因此,匿名类中的方法不能更改封闭方法中的变量值,但它们可以更改封闭类中的成员值.
C++ lambda可以引用封闭函数中的所有数据(包括mutable),如果它嵌套在成员函数中,那么它可以对封闭类的数据执行相同的操作.程序员声明了对封闭范围的精确依赖程度,因此它是显式的而不是隐式的.
这使它们非常相似,但Java特性以不同的方式处理方法中的局部变量/参数,原则是它们不应该在方法之外是可变的,特别是在传统上如此随意地使用线程的语言中.
与C#lambdas相比,它没有任何限制,所有依赖都是隐式的.这使得它们成为迄今为止最简单的这些特征(也有助于它们具有最佳的类型推断).但是在缺点方面,它们使所有关于线程的简单规则无效,即局部变量"在线程堆栈上"并且因此在访问之前从不需要锁定不再是必然的.
| 归档时间: |
|
| 查看次数: |
1933 次 |
| 最近记录: |