Groovy中的匿名代码块

时间:2010-04-19 20:52:01

标签: java groovy

有没有办法在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”的变量也是一个反模式,所以对于我正在研究的代码,匿名代码块会有所帮助。

6 个答案:

答案 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);