封闭的集合。不同的调用方法。

时间:2012-10-02 16:22:53

标签: collections groovy closures

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

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  

2 个答案:

答案 0 :(得分:2)

两种陈述的副作用是相同的:它们打印“1234”。但返回值不同。

prtn方法始终返回null,因此listObj.collect{ obj-> obj.prtn() }的值为[null, null, null, null]

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

通常,如果您只想迭代某个集合以产生一些副作用,请使用each;如果要将其转换为其他集合,请使用collect。并尝试不混合副作用迭代和转换:)

答案 1 :(得分:0)

你也可以这样做:

listObj*.prtn()

这会产生与方法#1相同的结果