스칼라의 스트림, 뷰 (SeqView) 및 반복자의 차이점은 무엇입니까? 이것은 나의 이해이다 :
- 그들은 모두 게으른 목록입니다.
- 스트림은 값을 캐시합니다.
- 반복자는 한 번만 사용할 수 있습니까? 처음으로 돌아가서 값을 다시 평가할 수 없습니까?
- 뷰의 값은 캐시되지 않지만 계속해서 평가할 수 있습니까?
따라서 힙 공간을 절약하려면 반복자 (목록을 다시 탐색하지 않는 경우) 또는 뷰를 사용해야합니까? 감사.
스칼라의 스트림, 뷰 (SeqView) 및 반복자의 차이점은 무엇입니까? 이것은 나의 이해이다 :
따라서 힙 공간을 절약하려면 반복자 (목록을 다시 탐색하지 않는 경우) 또는 뷰를 사용해야합니까? 감사.
답변:
첫째, 모두 엄격하지 않습니다 . 그것은 함수와 관련된 특별한 수학적 의미를 가지고 있지만, 기본적으로 사전에 대신에 주문형으로 계산된다는 것을 의미합니다.
Stream
실제로 게으른 목록입니다. 실제로, 스칼라에서 a Stream
는 List
누구 tail
입니다 lazy val
. 일단 계산되면 값은 계산 된 상태로 유지되고 재사용됩니다. 또는 말할 수 있듯이 값이 캐시됩니다.
은 Iterator
단지 그것이 있기 때문에 한 번만 사용할 수 있습니다 탐색 포인터 모음으로, 그리고 자체 컬렉션입니다. 무엇 스칼라에서 특별하게 만드는 것은 당신이 같은 변환을 적용 할 수 있다는 사실 map
과 filter
단순히 새로운 얻을 Iterator
당신이 다음 요소를 요청할 경우에만 이러한 변환을 적용 할를.
스칼라는 재설정 할 수있는 반복자를 제공했지만 일반적으로 지원하기가 매우 어렵고 버전 2.8.0을 만들지 않았습니다.
뷰는 데이터베이스 뷰와 매우 유사합니다. "가상"컬렉션을 생성하기 위해 컬렉션에 적용되는 일련의 변환입니다. 말씀 드린대로 모든 변환은 요소를 가져와야 할 때마다 다시 적용됩니다.
모두 Iterator
와 뷰는 우수한 메모리 특성을 가지고있다. Stream
훌륭하지만 스칼라에서 주요 이점은 무한 시퀀스 (특히 반복적으로 정의 된 시퀀스)를 작성하는 것입니다. 하나는 수 의 모두를 유지하지 않도록 Stream
당신이 자신에 대한 참조를 유지하지 않는함으로써,하지만, 메모리 head
(예를 들어, 사용하여 def
대신 val
을 정의하기 위해 Stream
).
뷰에 의한 불이익으로 인해 일반적으로 force
변환을 적용한 후 뷰의 전체 크기와 비교하여 페치 될 요소가 거의없는 경우 뷰로 유지해야합니다.
Iterator
또한 무한을 프로빙하는 데 매우 편리하며 일반적으로 가능한 경우 스트림보다 선호합니다. 스트림의 실질적인 이점은 이전에 액세스 한 값이 캐시된다는 점인데, 이는 이전 값으로 정의 된 피보나치 시퀀스와 같은 것을 구현하려고 할 때 심각한 이점입니다.