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
再见马里奥
嗯,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 代理)来捕获期望值。