2009-10-06 6 views

답변

42

스트림 memoises 및 반복기는 그렇지 않습니다. 동일한 스트림을 여러 번 탐색하여 매번 동일한 결과를 얻을 수 있습니다. 반대로 Iterator는 한 번만 통과 할 수 있습니다.

+1

memoization과 관련하여 - N 번째 요소에 액세스하는 경우 액세스 시간이 O (1) 또는 O (N)입니까? – ryeguy

+7

@ryeguy Stream은 요소 값을 캐시하기 위해 링크 된 목록을 작성하므로 O (n)입니다. –

+1

그렇다면 Stream과 Iterable의 차이점은 무엇입니까? –

18

두 요소는 아직 알려지지 않은 나머지 요소 (게으른 꼬리) 목록이있는 현재 요소에 액세스하기위한 구문입니다.

Iterator은 한 번만 트래버스 할 수있는 필수 구성입니다.

Stream은 기능적인 구조이다. 이론적으로 여러 번 트래버스 할 수 있습니다 (그리고 언급 된 다른 부분은 이미 계산 된 부분을 다시 계산하지 않습니다). 실제로 스트림은 무한하거나 매우 크기 때문에 (실제로는 처음 사용하는 이유입니다.) 전체 스트림에 대한 참조는별로 의미가 없습니다 (Out of Memory를 실행하는 것은 꽤 쉽습니다).

일반적으로 그에게 마음에 안전과 같은 스칼라의 Stream가 머리에 게으른 아니라는 사실로 인한 예기치 않은 동작이있을 수있다 일반 Stream 초를 피하십시오. 다른 방법으로 약한 참조를 사용하거나 참조 번호 Iteratees (here 참조) 또는 something similiar을 사용하여 자동 참조 된 Scalaz EphemeralStream을 사용하고 있습니다.

+0

궁금합니다. EphemeralStream이 기본 구현이 아닌 이유는 무엇입니까? 잊어 버린 부분은 언제나 데이터 계보 (함수 언어)에서 재구성 할 수 있습니다. 이것은 큰 디자인 결함처럼 들립니다. – tribbloid

관련 문제