7

在我去年做的一个 Java 集成项目中,我发现了 lambdaj,并立即被它让我更快地生成更具可读性的代码的能力所折服。我记得当时读到 lambda 表达式大约在 1.8 版本,并认为我找到了一个插件,它已经为我带来了所有这些功能。

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

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

4

2 回答 2

22

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

Mario Fusco - lambdaj 创造者

于 2014-01-29T09:05:41.130 回答
8

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 对计算未来的赌注,其中提高性能的唯一方法将是涉及更多并行处理流。

于 2014-01-28T16:49:16.450 回答