如何使用Groovy闭包选择特定字段

如何使用Groovy闭包选择特定字段,groovy,closures,Groovy,Closures,鉴于: 我需要从每个果篮里挑选苹果。工作需要在以下过程中完成: class FruitBasket { int apples = 0 int oranges = 0 } 但它抱怨说 def processFruit(list, picker) { list.each { println "processing " + picker(it) } } def processAll() { List fruitList = [

鉴于:

我需要从每个果篮里挑选苹果。工作需要在以下过程中完成:

class FruitBasket {
    int apples = 0
    int oranges = 0
}
但它抱怨说

def processFruit(list, picker) {
    list.each {
        println "processing " + picker(it)
    }
}

def processAll() {
    List fruitList = [
        new FruitBasket("apples": 2, "oranges": 4),
        new FruitBasket("apples": 3, "oranges": 5)
    ]

    processFruit(fruitList, applePicker)
}

def applePicker(FruitBasket f) {
    return f.getApples()    
}

闭包果篮参数可能有问题…

在该代码中,applePicker是一个方法,而不是闭包

您可以使用方法句柄将方法作为参数传递,如下所示:

No such property: applePicker for class: FooTest
applePicker = { FruitBasket f ->
    return f.getApples()
}
或者将其更改为实际关闭:

processFruit(fruitList, this.&applePicker)

您正在将
applePicker
传递给
processFruit
,但它是一种方法。您只能通过这种方式传递闭包。将
applePicker
重新定义为一个闭包,如下所示:

def applePicker = { FruitBasket f -> return f.getApples()    }
或者在调用
processFruit
时将方法转换为闭包:

processFruit(fruitList, this.&applePicker)