2014-12-21 5 views
2

언제 닫는 코드 each을 사용해야하고 언제 Groovy에서 for 루프를 사용해야합니까? 둘 다 효과적으로 같은 일을합니다.Groovy에서`each '와 for 루프를 사용하는 경우

groovy:000> a = [1, 2, 3, 4] 
===> [1, 2, 3, 4] 
groovy:000> a.each { 
groovy:001> println it 
groovy:002> } 
1 
2 
3 
4 
===> [1, 2, 3, 4] 
groovy:000> for (it in a) { 
groovy:001> println it 
groovy:002> } 
1 
2 
3 
4 
===> null 

each 클로저는 목록을 반환합니다. 그래서 아마 루프 대신 for 루프를 사용할 수 있지만 그 반대는 맞지 않습니까?

+2

기술 자료를 제쳐두고, 'each'를 사용하면 더 유용한 기능을 사용하도록 마음을 갖습니다. 'collect','groupBy'와 같은 메소드 ... – cfrick

+0

참조 http://groovy.329449.n5.nabble.com/using-each-versus-traditional-for-loop-td369781.html –

답변

3

for 루프는 빠른 그러나이 questionanswer, 당신이 할 수있는 조기 최적화 그래서 난 정말 차이가 어떤 시나리오를 찾을 수 없습니다 프로그래밍의 모든 악의 뿌리는 것을 기억하십시오.

each도 운영 중이던 수정되지 않은 전체 컬렉션을 반환하며 here은 OP에서 유용하다고 판단한 특정 시나리오입니다. for 구문은 아무 것도 반환하지 않습니다.

3

각 구문이 구문 설탕이기 때문에 for 루프가 다소 빠르고 효율적입니다. 그러나 실제로 변화를 가져올 수있는 상황을 상상할 수는 없습니다.

내 조명으로 인해 유일한 차이점은 예외를 throw하지 않고 각 클로저를 종료 할 수 없다는 것입니다. for 반복문을 종료 할 수 있습니다.

나는 각각의 구조가 좀 더 관용적이라고 생각합니다.

+0

좋은 지적. 하지만 그게 다라고 생각합니까? – aa8y

+0

@ aa8y - 두 버전 모두를 사용하여 간단한 클래스를 디 컴파일하고 생성 된 바이트 코드를보고 각각이 무엇을하는지 볼 수 있습니다. 일반적으로 Groovy iterating 구조는 단순 루프보다 오버 헤드가 약간 더 많아서 추가 성능이 필요한 경우 ... – cjstehno

2

코드를 변경하면 나중에 쉽게 될 수 있기 때문에 일반적으로 Groovier는 each을 선호합니다. each 메소드는 Groovy에 유비쿼터스 한 기능적 메소드 계열과 관련이 있습니다. 반대로 for 루프는 Java의 명령형 스타일에서 벗어났습니다. 시작 예를 들어

, 우리는 각 항목에 대한 bar 전화 foo 원하는 상상 : 지금

def bar = { println it } 

def foo = { def a -> 
    a.each { bar it } 
} 

foo([1,2,3,4]) 

우리는 심지어 숫자 bar를 호출 할 경우 어떻게 :

def bar = { println it } 

def foo = { def a -> 
    a.findAll{ (it % 2) == 0 }.each{ bar it } 
} 

foo([1,2,3,4]) 

무엇 bar에 항목의 목록 색인이 필요하다는 것을 발견하면?

def bar = { def item, def index -> println "${index} ${item}" } 

def foo = { def a -> 
    a.eachWithIndex{ def x, def i -> bar x, i } 
} 

foo([1,2,3,4]) 

루프를 for과 함께 쓰십시오. 물론, 할 수 있지만, 변경 사항은보기 흉한 것 같습니다. 주석에 언급 된 바와 같이, collect 및 다른 방법을 배우고 싶을 것입니다. Foreach은 다소 잘못된 이분법입니다.

관련 문제