2012-10-02 4 views
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 

답변

0

또한 수행 할 수 있습니다

listObj*.prtn() 

을 그리고 이것은 당신의 방법 #과 같은 결과를 제공 한

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을 사용하십시오. 부작용과 변형을 섞어서 사용하지 마십시오.

관련 문제