lambdaj 闭包中使用的 Java 机制
-
06-07-2019 - |
题
Lamdbaj允许在Java语言中定义闭包,可以找到各种例子这里
我的问题是关于使用的底层 Java 机制,例如,定义 println
闭包,使用以下代码:
Closure println = closure();
{ of(System.out).println(var(String.class)); }
随后可以通过以下方式执行此关闭:
println.apply("foobar");
我很好奇Java中的哪些机制允许调用 of(...).println(...)
与 println
实例本身。
当然,lambdaj 源代码是可以阅读的,但我希望如果有人有的话,能得到一个稍微更高层次的解释。我的反思技能包括一些内省和动态执行方法。
解决方案
嗯,的可能是一个静态导入的
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设计风格称为 流利 ,最佳展示方式为 JMock 测试库。
顺便说一句,如果这应该为Java引入闭包,那就太荒谬了 - 语法难以置信的。他们的I / O例子实际上让我大笑。尝试 Scala !
编辑 - 两个 println
调用相关联我相信因为第一个调用序列允许库捕获您作为参数传入的变量。这些可能是在一些 ThreadLocal
结构中捕获的。然后,当您调用(也可能是静态的) println
方法时,库正在使用此捕获的数据实际执行稍后的行为。同样测试相关,EasyMock测试框架使用类似的机制(在后台使用Java代理)来捕获预期值。
其他提示
我是 Mario Fusco,是 lambdaj 库的主要开发人员。
首先我想澄清一件事:lambdaj 无意取代任何函数式语言。正如我上周在 Zurich 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
再见马里奥