lambdaj 并没有真正提供 lambda 表达式
这是对的。
[lambdaj] 提供了一些相同的功能,例如闭包
如果你的意思是“它提供了闭包”——不,它没有。没有 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 中吗?
绝对的,而且支持是非常认真和完整的。两者都有更多的功能,并且功能更具可组合性。与 Java 8 中开箱即用的功能相比,LamdaJ 的功能相形见绌。请查看Streams API。
Streams API 背后的主要设计目标之一甚至从未打算由 LambdaJ 实现:处理的自动并行化。当然,面向 FP 的集合处理看起来比命令式的习惯用法更好,但这不仅仅是看起来:它是一个根本性的变化。这是 Java 对计算未来的赌注,其中提高性能的唯一方法将是涉及更多并行处理流。