首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lambda表达式与lambdaj

Lambda表达式与lambdaj
EN

Stack Overflow用户
提问于 2014-01-28 14:15:07
回答 2查看 2.3K关注 0票数 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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-28 16:49:16

lambdaj并不真正提供lambda表达式

这是正确的。

lambdaj提供了一些相同的功能,例如闭包。

如果这意味着“它提供闭包”-no,那么它就不存在了。如果没有lambda表达式,闭包就不可能存在;它实际上是lambda表达式的特例,它是最需要实现的。

不幸的是,LambdaJ的项目文档在将“闭包”一词应用于一些不合格的东西时是非常误导的。闭包 wiki页面中的一个示例:

代码语言:javascript
复制
Closure println = closure(); { of(System.out).println(var(String.class)); }

以下是这个例子的解释:

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

这条语句完全是错误的:根本不存在变量绑定,更不用说自由变量了。构造的结果类似于一元函数,它需要一个String参数。(它实际上期望的是一个Object,但如果传递一个非String,则会在运行时失败。)

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

我想知道1.8的lambda表达式能给Java项目带来什么,而lambdaj却不能这样做。这仅仅是一个提高性能的问题,以及对匿名函数的本地支持吗?

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

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

绝对的,而且支持是非常严肃和完整的。这两个特性都更多,而且功能更可组合。在Java 8中,LamdaJ的功能与现成的功能相比相形见绌。请看一下API接口

Streams背后的主要设计目标之一甚至从未打算由LambdaJ实现:处理的自动并行化。当然,面向FP的集合处理看起来比命令式成语要好得多,但这比外观更重要:这是一个根本性的变化。这是Java对计算未来的押注,在那里,提高性能的唯一方法将是涉及更多并行处理流。

票数 8
EN

Stack Overflow用户

发布于 2014-01-29 09:05:41

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

Mario Fusco - lambdaj创建者

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21407956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档