collections - 关闭的集合。不同的调用方式。

标签 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  

最佳答案

这两个语句的副作用是相同的:它们打印“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。并且尽量不要混合副作用迭代和转换:)

关于collections - 关闭的集合。不同的调用方式。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12694300/

相关文章:

java - PriorityQueue 是否保持自然顺序?

java - 什么是哈希碰撞

c# - 为什么 WCF 会像我预期的那样返回 myObject[] 而不是 List<T>?

gradle - 我如何知道gradle插件属性的评估何时会推迟?

dictionary - groovy:安全地在映射中找到键并返回其值

scala - 使用 4 个(或 N 个)集合一次只产生一个值(1xN)(即为 tuple4+ 压缩)

groovy - 在 Groovy 中抛出/捕获异常

regex - 如何检查 Jenkins 婴儿车是否包含字符

javascript - javascript 对象的值不变(通过引用传递)

ios - 将 block 形式的 objective-c 解决为 swift 3