在lambdaj闭包中使用的Java机制

Der*_*mer 6 java reflection closures lambdaj

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

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

Closure println = closure(); 
{ of(System.out).println(var(String.class)); }
Run Code Online (Sandbox Code Playgroud)

随后可以通过以下方式执行此关闭:

println.apply("foobar");
Run Code Online (Sandbox Code Playgroud)

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

当然,lambdaj源代码可供阅读,但我希望有更高级别的解释,如果有人有一个.我的反思技巧可以动态地进行一些内省和执行方法.

Mar*_*sco 10

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

首先,我想澄清一下:lambdaj并不是要取代任何函数式语言.正如我上周在苏黎世Jug演讲中所说,如果你有机会使用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

再见马里奥


oxb*_*kes 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);
  }

} 
Run Code Online (Sandbox Code Playgroud)

突然间:

Fac.of(System.out).println(Fac.var(String.class));
Run Code Online (Sandbox Code Playgroud)

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

import static Fac.*;

of(System.out).println(var(String.class));
Run Code Online (Sandbox Code Playgroud)

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

顺便说一句,如果这应该向 Java 引入闭包,那就太荒谬了——语法太糟糕了。他们的 I/O 示例确实让我笑出了声。尝试斯卡拉

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

  • +1。在学习了 3 年 C++ 之后,我以为我知道丑陋的闭包,但是*全能的上帝*...... (3认同)