【问题标题】:Collection of closures. Different invocation methods.闭包的集合。不同的调用方法。
【发布时间】:2012-09-23 13:02:18
【问题描述】:

在工作中,我们正在讨论一个简单(或不那么简单)的问题。 ¿ 下面的调用方法有区别吗?

class Obj {
    def num
    def prtn = {
        print this.num
    }
}  
def listObj = [new Obj(num:1), new Obj(num:2), new Obj(num:3), new Obj(num:4)]  
// End Common code  

// Method #1  
def lst = listObj.collect{ obj-> obj.prtn() }  

// Method #2  
def lst = listObj.collect{ obj-> { -> obj.prtn()} }.each{ it() }  
// Common code  

【问题讨论】:

    标签: collections groovy closures


    【解决方案1】:

    这两个语句的副作用是相同的:它们打印“1234”。但返回值不同。

    prtn方法总是返回null,所以listObj.collect{ obj-> obj.prtn() }的值为[null, null, null, null]

    listObj.collect{ obj-> { -> obj.prtn()} }.each{ it() } 的情况下,由于each 返回调用它的集合,结果将是一个闭包对象列表(因为这就是listObj.collect{ obj-> { -> obj.prtn()} } 返回的内容)。

    一般来说,如果你只想迭代一个集合以获得一些副作用,请使用each;如果要将其转换为不同的集合,请使用collect。并尽量不要混合副作用迭代和转换:)

    【讨论】:

      【解决方案2】:

      你也可以这样做:

      listObj*.prtn()
      

      这与您的方法 #1 给出相同的结果

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 2016-11-09
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 2012-06-06
        • 2021-12-31
        • 2016-10-22
        • 1970-01-01
        相关资源
        最近更新 更多