【问题标题】:How to select specific field using Groovy Closure如何使用 Groovy Closure 选择特定字段
【发布时间】:2012-07-24 15:20:02
【问题描述】:

给定:

class FruitBasket {
    int apples = 0
    int oranges = 0
}

我需要从每个 FruitBasket 中挑选苹果。需要在processFruit中完成的工作:

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()    
}

但它在@runtime 抱怨

No such property: applePicker for class: FooTest

可能是闭包 FruitBasket arg 的问题...

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    在那段代码中,applePicker 是一个方法,而不是一个闭包。

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

    processFruit(fruitList, this.&applePicker)
    

    或将其更改为实际的闭包:

    def applePicker = { FruitBasket f -> return f.getApples()    }
    

    【讨论】:

      【解决方案2】:

      您将applePicker 传递给processFruit,但它是一种方法。你只能通过这种方式传递闭包。将applePicker 重新定义为像这样的闭包:

      applePicker = { FruitBasket f ->
          return f.getApples()
      }
      

      或者在调用processFruit时将方法转换为闭包:

      processFruit(fruitList, this.&applePicker)
      

      【讨论】:

        猜你喜欢
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 2016-06-02
        • 2017-04-06
        • 1970-01-01
        相关资源
        最近更新 更多