在工作中,我们正在讨论一个简单(或不那么简单)的问题。 ¿以下调用方法之间有什么区别吗?
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
答案 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相同的结果