java Lambda表达式与lambdaj
在我去年做的一个Java集成项目中,我发现了lambdaj,并立即确信它能够让我更快地生成可读性更强的代码。我记得当时读到过关于lambda表达式也将成为1.8的文章,我想我已经找到了一个插件,它已经为我带来了所有这些功能
现在,我重新审视lambda表达式,发现我可能误解了lambdaj的目的和范围。在我看来,lambdaj并没有真正提供lambda表达式,而是一种特定于领域的语言,旨在取代集合上的重复循环。它的DSL语法看起来类似于匿名函数,并提供了一些相同的功能,如闭包和curried函数,但最终受到JLS的限制
我现在想知道1.8的lambda表达式能为Java项目带来什么,而lambdaj却不能。这仅仅是一个提高匿名函数本机支持性能的问题吗?类似于lambdaj的集合操作函数的表达式是否会出现在1.8中?或者1.8中的lambda表达式是我用来创建自己的匿名函数的吗。在这种情况下,是否应该为1.8制作一个特定版本的lambdaj,使用真正的匿名函数重新创建函数库
# 1 楼答案
这是正确的
如果您的意思是“它提供闭包”-不,它没有。没有lambda表达式,闭包就不可能存在;它实际上是lambda表达式的一个特例,是最需要实现的表达式
不幸的是,LambdaJ的项目文档在将“闭包”一词应用于不符合条件的东西时存在相当大的误导性。其Closureswiki页面中的一个示例:
该示例后面是以下说明:
这种说法完全是错误的:这里根本没有变量绑定,更不用说自由变量。构造的结果类似于一元函数,它需要一个
String
参数。(好的,它实际期望的是一个Object
,但是如果传递一个非String
,它将在运行时失败。)另一方面,示例中的
of()
调用确实有点向局部变量捕获的方向发展。我们可以说传递给of()
的参数被它返回的对象捕获。但是,我们不能在任何进一步的语法中引用它;它只是随后方法调用的隐式目标。这与全面关闭相去甚远因为LambdaJ不提供编写匿名函数的能力,所以这个问题在技术上是无法回答的。但是,请放心,Java8的闭包在每个用例的基础上都会优于LambdaJ,因为LambdaJ基本上是基于反射的,而Java的闭包根本不需要反射
绝对是的,而且支持是非常严肃和全面的。这两个特性都更多,而且这些特性更易于组合。LamdaJ的功能与Java8中现成的功能相比相形见绌。查看Streams API
Streams API背后的一个主要设计目标甚至从未打算由LambdaJ实现:处理的自动并行化。当然,面向FP的集合处理看起来比命令式习惯用法要好,但这远不止是外观:它是一个基本的变化。这是Java对计算未来的赌注,提高性能的唯一方法是使用更多的并行处理流
# 2 楼答案
忘记lambdaj,尽快开始使用Java8lambda表达式
马里奥·福斯科-兰姆达伊创作者