Lambda表达式与lambdaj

时间:2014-01-28 14:15:08

标签: java lambda java-8 lambdaj

在去年我做过的Java集成项目中,我发现了lambdaj,并且立刻被它能够让我更快地生成更易读的代码。我记得在那段时间里读到关于lambda表达式的1.8,并且认为我找到了一个已经为我带来了所有功能的插件。

现在我重新审视lambda表达式,看看我可能误解了lambdaj的目的和范围。我现在看到它的方式,lambdaj并不真正提供lambda表达式,而是一种特定于域的语言,旨在替换集合上的重复循环。它的DSL语法看起来与匿名函数类似,并提供了一些相同的功能,如闭包和curried函数,但最终它受到JLS的限制。

我现在想知道1.8的lambda表达式可以为lambdaj所能实现的Java项目带来什么。是否只是通过本机支持匿名功能来提高性能? 1.8中会出现类似于lambdaj集合操作函数的表达式吗?或者1.8中的lambda表达式对我来说是创建我自己的匿名函数。在这种情况下,是否应该为1.8创建一个特定版本的lambdaj,使用真正的匿名函数重新创建函数库?

2 个答案:

答案 0 :(得分:17)

忘记lambdaj并开始使用Java 8 lambda表达式asap!

Mario Fusco - lambdaj创作者

答案 1 :(得分:7)

  

lambdaj并不真正提供lambda表达式

这是正确的。

  

[lambda]提供了一些相同的功能,例如闭包

如果你的意思是“它提供闭包” - 不,它没有。没有lambda表达式就不能存在闭包;它实际上是lambda表达式的一个特例,它是最需要实现的表达式。

不幸的是,LambdaJ的项目文档在将“闭包”一词应用于不符合条件的内容时会产生误导。来自Closures wiki页面的示例:

Closure println = closure(); { of(System.out).println(var(String.class)); }

这个例子之后是这个解释:

  

特别是var()方法将类型为String的自由变量绑定到闭包。

那句话简直是假的:那里根本没有变量绑定,更不用说自由变量了。该构造产生类似于一元函数的东西,它需要一个String参数。 (嗯,它实际期望的是Object,但如果传递非String,则会在运行时失败。)

另一方面,示例中的of()调用确实在局部变量捕获方向上有所改变。我们可以说传递给of()的参数是由它返回的对象捕获的。但是,我们不能在任何进一步的语法中引用它;它只是后面的方法调用的隐式目标。这与完全关闭相去甚远。

  

我想知道1.8的lambda表达式可以为lambdaj不能的Java项目带来什么。是否只是通过本机支持匿名函数来提高性能?

由于LambdaJ不提供编写匿名函数的能力,因此技术上无法回答这个问题。但是,请放心,Java 8的闭包将在逐个使用的基础上超越LambdaJ,因为LambdaJ基本上是基于反射,而Java的闭包根本不需要它。

  

类似于lambdaj的集合操作函数的表达式是否会出现在1.8中?

当然,支持非常严肃和完整。还有更多功能,功能更具可组合性。 LamdaJ的功能与Java 8中开箱即用的功能相形见绌。查看Streams API

Streams API背后的主要设计目标之一甚至从未由LambdaJ实现:自动并行化处理。当然,面向FP的集合处理看起来比命令式成语更好,但这远不止外观:它是基本的变化。这是Java对计算未来的赌注,其中提升性能的唯一方法是涉及更多并行的处理流。