有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,使用真正的匿名函数重新创建函数库


共 (2) 个答案

  1. # 1 楼答案

    lambdaj doesn't really offer lambda expressions

    这是正确的

    [lambdaj] provides some of the same functionality such as closures

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

    不幸的是,LambdaJ的项目文档在将“闭包”一词应用于不符合条件的东西时存在相当大的误导性。其Closureswiki页面中的一个示例:

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

    该示例后面是以下说明:

    In particular the var() method binds a free variable of type String to the closure.

    这种说法完全是错误的:这里根本没有变量绑定,更不用说自由变量。构造的结果类似于一元函数,它需要一个String参数。(好的,它实际期望的是一个Object,但是如果传递一个非String,它将在运行时失败。)

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

    I'm wondering what 1.8's lambda expressions can bring to a Java project that lambdaj can't. Is it just a matter of increased performance with native support for anonymous functions?

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

    Will expressions similar to lambdaj's collection manipulation functions be present in 1.8?

    绝对是的,而且支持是非常严肃和全面的。这两个特性都更多,而且这些特性更易于组合。LamdaJ的功能与Java8中现成的功能相比相形见绌。查看Streams API

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

  2. # 2 楼答案

    忘记lambdaj,尽快开始使用Java8lambda表达式

    马里奥·福斯科-兰姆达伊创作者