【问题标题】:Java mechanisms at use in lambdaj closureslambdaj 闭包中使用的 Java 机制
【发布时间】:2009-10-23 21:19:16
【问题描述】:

Lamdbaj 允许在 Java 语言中定义闭包,可以找到各种示例 here

我的问题是关于使用的底层 Java 机制,例如,要定义 println 闭包,使用以下代码:

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

这个闭包随后可以通过以下方式执行:

println.apply("foobar");

我很好奇 Java 中的哪些机制允许对 of(...).println(...) 的调用与 println 实例本身相关联。

当然,可以阅读 lambdaj 源代码,但如果有人有的话,我希望能得到更高层次的解释。我的反思技巧甚至是一点点内省和动态执行方法。

【问题讨论】:

  • 我错过了“关闭”位吗?我看到一个方法被提升了,但就是这样。 :-/
  • 其实 Lambdaj 不支持闭包。具体来说,它无法从封闭范围中捕获变量。

标签: java reflection closures lambdaj


【解决方案1】:

我是 Mario Fusco,是 lambdaj 库的主要开发人员。

首先我想澄清一点:lambdaj 并不是要取代任何函数式语言。正如我上周在苏黎世的 Jug of Zug 演讲中所说,如果你有机会使用 Scala,那就去吧,永远不要回头。在这里您可以找到我的演讲简历,其中明确指出:

http://ctpjava.blogspot.com/2009/10/lambdaj-new-trends-in-java.html

我也是一个快乐的 Scala 开发人员。但有时你只是不得不用 Java 开发(根据我的经验,在现实世界中,大约 80% 的时间你不能选择你必须用哪种语言编写代码),在这种情况下,一些 lambdaj 特性可能是有帮助(或者我希望如此)。我只是想为 Java 带来一些完全缺失的功能特性。当然,结果并不完全令人满意,主要是由于Java本身的限制。

至于内部 lambdaj 机制,是的,它使用 ThreadLocal 来实现该结果。如果您对 lambdaj 有其他问题、好奇心甚至更好的建议和建设性的批评者,也许您可​​能有兴趣在此处注册 lambdaj 邮件列表:

http://groups.google.com/group/lambdaj

再见 马里奥

【讨论】:

    【解决方案2】:

    好吧,of 大概是一个静态导入的static 方法,因此可以在没有封闭类名的情况下调用它。我希望var 是一样的。两种方法都必须返回某种类型,该类型具有随后调用的方法:

    public class Printable {
      public void println(Var var);
    }
    
    public class Fac {
      public static Printable of(Object o) {
        return new Printable(o);
      }
    
      public static Var var(Class<?> clazz) {
        return new Var(clazz);
      }
    
    } 
    

    突然间:

    Fac.of(System.out).println(Fac.var(String.class));
    

    是有效的 Java。使用静态导入,嘿presto:

    import static Fac.*;
    
    of(System.out).println(var(String.class));
    

    花括号显然是有效的 Java,因为您可以在任何方法中添加它们来帮助定义词法 sope。这种 API 设计风格被称为 fluent 并且最好由 JMock 测试库展示。

    顺便说一句,如果这应该在 Java 中引入闭包,那就太荒谬了——语法是难读的糟糕。他们的 I/O 示例实际上让我大笑起来。试试 Scala

    EDIT - 我相信这两个 println 调用是关联的,因为第一个调用序列允许库捕获您作为参数传入的变量。这些可能在某些ThreadLocal 结构中被捕获。然后,当您调用(也可能是静态的)println 方法时,库将使用此捕获的数据在稍后实际执行该行为。同样与测试相关的是,EasyMock 测试框架使用类似的机制(在后台使用 Java 代理)来捕获预期值。

    【讨论】:

    • +1。在使用了 3 年 C++ 之后,我以为我知道丑陋的闭包,但是 全能的上帝...
    • 谢谢,我现在确实已经切换到 Scala 进行大部分积极的开发。但这仍然让我感到困惑,我理解静态导入元素,我的困惑是在我的开场示例中,对 of(...).println(...) 的调用如何与它之前定义的实例“println”相关联.
    • 好的 - 我已经编辑了我的答案,因为我想我知道这可能是怎么发生的
    • 太棒了,在你说完之后,偶然发现 ThreadLocal 被埋在 lambdaj 源代码中的一些闭包/代理生成中,谢谢。
    • 那么,考虑到我喝了多少啤酒:-)
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多