有没有办法在Groovy中使用匿名代码块?例如,我正在尝试将以下Java代码转换为Groovy:
{
int i = 0;
System.out.println(i);
}
int i = 10;
System.out.println(i);
我能提出的最接近的翻译如下:
boolean groovyIsLame = true
if (groovyIsLame) {
int i = 0
println i
}
int i = 10
println i
我知道匿名代码块通常是反模式。但是使用名为“inputStream0”和“inputStream1”的变量也是一个反模式,所以对于我正在研究的代码,匿名代码块会有所帮助。
答案 0 :(得分:16)
您可以在Groovy中使用匿名代码块,但这些代码块和闭包之间的语法不明确。如果您尝试运行此操作,实际上会出现此错误:
模棱两可的表达可能是一个 无参数闭包表达式或 孤立的开放代码块;解: 添加显式闭包参数 列表,例如{it - > ...},或强迫它 通过给予被视为开放的块 它是一个标签,例如L:{...}在线:1, 专栏:1
根据建议,您可以使用标签,它将允许您使用匿名代码块。在Groovy中重写Java代码:
l: {
int i = 0
println i
}
int i = 10
println i
答案 1 :(得分:6)
1.times {
// I'm like a block.
}
答案 2 :(得分:2)
怎么样:
({
int i = 0
println i
}).()
int i = 10
println i
我手边没有Groovy安装,但应该这样做。
答案 3 :(得分:1)
在Groovy中,那些括号构成了一个封闭字面。所以,没有办法。就个人而言,我认为不得不放弃匿名封锁以获得非常好的封锁。
答案 4 :(得分:0)
匿名块的最常见需求是使用def
进行额外(可能是阴影)绑定。一种选择是创建一个等同于绑定的字典并使用.with
。使用问题中给出的示例:
[i:0].with {
println i
}
int i = 10
println i
这为您提供了一个lisp样式的let
块
答案 5 :(得分:0)
为什么不直接添加if(true)
if(true) {
int i = 0;
System.out.println(i);
}
int i = 10;
System.out.println(i);