2

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

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  
4

2 回答 2

2

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

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

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

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

于 2012-10-02T17:45:59.223 回答
0

你也可以这样做:

listObj*.prtn()

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

于 2012-10-02T16:28:34.413 回答