2010-01-28 9 views
14

프레젠테이션의 1 개에 "이 방법은 LAZY입니다!"라고 표시됩니다. 누군가가 나를 그들이이 무슨 뜻인지 이해하는 데 도움이대부분의 Iterators 및 Iterables 메서드는 LAZY입니다! 이것은 무엇을 의미합니까?

Iterable transform(Iterable, Function)* 
Iterable filter(Iterable, Predicate)* 
T find(Iterable<T>, Predicate) 
Iterable concat(Iterable<Iterable>) 
Iterable cycle(Iterable) 
T getOnlyElement(Iterable<T>) 
Iterable<T> reverse(List<T>) 

, 나는 Persons의 컬렉션을했습니다 나는 필터가 그 성 DOE 경우에만 사람을 반환 적용 말할 수 있습니다.

이렇게하면 "doeOnly.next()의 첫 번째 호출에서만 필터링이 발생합니까?"

List<Person> persons= .... 
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE); 
+0

필터링은 'doeOnly.hasNext()'가 아니라'next()'가 아닌 첫 번째 호출에서 발생해야합니다. 왜냐하면 하나의 요소 만 남았지 만 조건절에 실패하면 'hasNext()'는 false를 반환해야하지만 필터는 일치하지 않는 요소를 가져올 때까지이를 알지 못합니다. – finnw

답변

28

그것은 데이터가 당신이 그것을 요청으로 필터링된다는 것을 의미한다 - 즉시 목록을 통해 이동하고 필터링 된 데이터의 새 목록을 구축하지 않습니다. 대신, 향상된 루프에서 자동으로 iterator.next()을 호출하면 이터레이터는 업스트림 데이터 소스 (컬렉션)에 다음 데이터 항목을 요청합니다. 그러면 필터와 일치 시키려고 시도합니다. 일치하면 해당 항목을 반환합니다. 그렇지 않으면 컬렉션에서 다른 항목을 물어보고 항목이 부족하거나 일치 항목을 찾을 때까지 계속 이동합니다.

다음 다음 다음 항목을 요청하면 중단 된 부분부터 계속됩니다. 즉

, 그냥 "필터링은 doeOnly.next()의 최초의 호출시에 1 일"의미하지 않는다 - 그것은 iteratordoeOnly.iterator()를 호출 한 결과이다 "필터링 iterator.next() 호출에 발생"을 의미한다.

+0

유용한 정의 : http://en.wikipedia.org/wiki/Lazy_evaluation. –

+0

두 응답 모두 ... 또한 google-collect 사용 또는 지연된 평가를 사용합니다. –

+0

필터 및 기타 방법의 게으름이 반복적으로 발생하는 것을 이해했습니다.하지만 게으름을 설명하고 getOnlyElement를 얻는 방법을 설명 할 수 있습니다. –

관련 문제