Groovy方法调用中括号的使用

Groovy方法调用中括号的使用,groovy,Groovy,我开始学习Groovy,并了解到括号在方法调用中是可选的,所以 def list = [0, 1, 2, 3] list.each ({ item -> println "Item: $item" }) 与 def list = [0, 1, 2, 3] list.each { item -> println "Item: $item" } 但是现在发现了这个例子 def list = [0, 1, 2, 3]

我开始学习Groovy,并了解到括号在方法调用中是可选的,所以

   def list = [0, 1, 2, 3]
   list.each ({ item ->
     println "Item: $item"
   })

   def list = [0, 1, 2, 3]
   list.each { item ->
     println "Item: $item"
   }
但是现在发现了这个例子

   def list = [0, 1, 2, 3]
   list.each() { item ->
     println "Item: $item"
   }

这同样有效。怎么可能先调用参数列表为空的方法,然后在它之后指定闭包呢?

当涉及闭包时,情况会有所不同。对于作为最后一个参数()出现的闭包,有一种特殊的功能

作为另一个例子,请考虑:

class Foo {
    int bar(s, c) {
        return c(s)
    }

    int abc(c, s) {
        return c(s)
    }
}

def foo = new Foo()
def s = "fox"
这是一种经典风格:

assert 3 == foo.bar(s, { it.size() })
然而,这将适用于闭包作为最后一个参数:

assert 3 == foo.bar(s) { it.size() }
这是经典:

assert 3 == foo.abc({ it.size() }, s)
但这行不通

// assert 3 == foo.abc({ it.size() }) s
毫无疑问,原因是,如果只有一个参数,如
List.each()
,则语法非常优雅:

list.each { item -> println item }