[scala] 스트림 vs 조회수 vs 반복자

스칼라의 스트림, 뷰 (SeqView) 및 반복자의 차이점은 무엇입니까? 이것은 나의 이해이다 :

  • 그들은 모두 게으른 목록입니다.
  • 스트림은 값을 캐시합니다.
  • 반복자는 한 번만 사용할 수 있습니까? 처음으로 돌아가서 값을 다시 평가할 수 없습니까?
  • 뷰의 값은 캐시되지 않지만 계속해서 평가할 수 있습니까?

따라서 힙 공간을 절약하려면 반복자 (목록을 다시 탐색하지 않는 경우) 또는 뷰를 사용해야합니까? 감사.



답변

첫째, 모두 엄격하지 않습니다 . 그것은 함수와 관련된 특별한 수학적 의미를 가지고 있지만, 기본적으로 사전에 대신에 주문형으로 계산된다는 것을 의미합니다.

Stream실제로 게으른 목록입니다. 실제로, 스칼라에서 a StreamList누구 tail입니다 lazy val. 일단 계산되면 값은 계산 된 상태로 유지되고 재사용됩니다. 또는 말할 수 있듯이 값이 캐시됩니다.

Iterator단지 그것이 있기 때문에 한 번만 사용할 수 있습니다 탐색 포인터 모음으로, 그리고 자체 컬렉션입니다. 무엇 스칼라에서 특별하게 만드는 것은 당신이 같은 변환을 적용 할 수 있다는 사실 mapfilter단순히 새로운 얻을 Iterator당신이 다음 요소를 요청할 경우에만 이러한 변환을 적용 할를.

스칼라는 재설정 할 수있는 반복자를 제공했지만 일반적으로 지원하기가 매우 어렵고 버전 2.8.0을 만들지 않았습니다.

뷰는 데이터베이스 뷰와 매우 유사합니다. “가상”컬렉션을 생성하기 위해 컬렉션에 적용되는 일련의 변환입니다. 말씀 드린대로 모든 변환은 요소를 가져와야 할 때마다 다시 적용됩니다.

모두 Iterator와 뷰는 우수한 메모리 특성을 가지고있다. Stream훌륭하지만 스칼라에서 주요 이점은 무한 시퀀스 (특히 반복적으로 정의 된 시퀀스)를 작성하는 것입니다. 하나는 의 모두를 유지하지 않도록 Stream당신이 자신에 대한 참조를 유지하지 않는함으로써,하지만, 메모리 head(예를 들어, 사용하여 def대신 val을 정의하기 위해 Stream).

뷰에 의한 불이익으로 인해 일반적으로 force변환을 적용한 후 뷰의 전체 크기와 비교하여 페치 될 요소가 거의없는 경우 뷰로 유지해야합니다.


답변