Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lambdaj闭包中使用的Java机制_Java_Reflection_Closures_Lambdaj - Fatal编程技术网

lambdaj闭包中使用的Java机制

lambdaj闭包中使用的Java机制,java,reflection,closures,lambdaj,Java,Reflection,Closures,Lambdaj,Lamdbaj允许在Java语言中定义闭包,可以找到各种示例 我的问题是关于使用的底层Java机制,例如,为了定义println闭包,使用了以下代码: Closure println = closure(); { of(System.out).println(var(String.class)); } 该关闭可通过以下方式执行: println.apply("foobar"); 我很好奇Java中的哪些机制会允许对(…).println(…)的调用与println实例本身相关联 当然,l

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

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

Closure println = closure(); 
{ of(System.out).println(var(String.class)); }
该关闭可通过以下方式执行:

println.apply("foobar");
我很好奇Java中的哪些机制会允许对(…).println(…)的
调用与
println
实例本身相关联


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

好吧,
大概是一个
静态
方法,它是静态导入的,因此可以在没有封闭类名的情况下调用它。我希望
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);
  }

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

import static Fac.*;

of(System.out).println(var(String.class));
花括号显然是有效的Java,因为您可以在任何方法中添加它们来帮助定义词汇sope。这个API设计风格被调用,并由测试库最好地展示出来

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


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

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

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

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

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

再见
马里奥。经过3年的C++,我认为我知道丑陋的闭包,但全能的上帝…谢谢,我已经切换到斯卡拉,我现在积极发展的大部分。但是这仍然让我困惑,我理解静态导入元素,我的困惑是调用(…)的方式。println(…)与前面定义的实例“println”有某种关联,在我的开始示例中。好的-我编辑了我的答案,因为我想我知道这可能是如何发生的,在你说了之后,我在lambdaj源代码中的一些闭包/代理生成中无意中发现了ThreadLocal,谢谢。考虑到我喝了多少啤酒,
:-)
我是否错过了“闭包”部分?我看到一种方法被取消了,但仅此而已-/实际上,Lambdaj不支持闭包。具体来说,它无法从封闭范围捕获变量。
import static Fac.*;

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