2013-04-17 2 views

답변

3

각보기 변환 연산자 (즉, map, filter 또는 slice과 같은 새보기를 생성하는보기)는 기본 모음을 다른 방식으로 탐색하는보기를 만듭니다. IndexedSeqViewS은 해당 컬렉션 클래스의 실제 이름이 아닙니다. toString이 반환하는 것으로 가장 많이 사용되는 이름입니다.

예를 들어, Mapped보기는 기본 모음의 각 요소가 어떤 방식으로 변환되도록 기본 모음의보기를 만듭니다.

이 다음과 같이 foreach을 재정의가 필요합니다 컬렉션이 정의를 오버라이드 (override), 상속 기반 설계를 가지고 있기 때문에

trait Filtered extends Transformed[A] { 
    // ... 
    def foreach[U](f: A => U) { 
     for (x <- self) 
     if (pred(x)) f(x) 
    } 
    // ... 
    } 

:

trait Mapped[B] extends Transformed[B] { 
    // ... 
    def foreach[U](f: B => U) { 
     for (x <- self) 
     f(mapping(x)) 
    } 
    // ... 
    } 

Filtered보기를 통과하면서 일부 요소를 무시 필요 foreach (및 apply, size 등의 다른 방법)의 하위 클래스가 도입되어야합니다. 일부 대체 설계에서, 예를 들어. 하나는 타입 클립을 기반으로하므로 특정 유형에 대해 foreach을 재정의하기 위해 별도의 typeclass를 도입해야 할 수 있습니다.

+0

'Stream [T] '작업마다 별도의 클래스가 있습니까? –

+1

아니요, 각 'Stream'작업에 대해 2 개의 클래스 만 있습니다. 빈 스트림과 스트림 단점이 있습니다. 그러나, 이러한 연산은 항상'Stream'을 반환하며, 모든 스트림은 동일한'foreach' 구현으로 통과합니다. '* View' 오퍼레이션은 콜렉션에 독립적입니다. 뷰 체인에서 기본 콜렉션 (foreach)의 순회는 이전에 호출 된 오퍼레이션에 따라 변경되고 다른 접근 자 오퍼레이션 (예 :'reduce', foreach' 또는'copyToArray')는 foreach로 구현됩니다. – axel22

+0

모든 가능한 뷰 변환에 대한 모든 정보를 포함한다면 일회용 조작 패턴을 피할 수 있습니다. 즉 모든 가능한 변환을 구현하는 하나의 큰 'flatMapFilterGroupBySlice' 메소드로 모든 뷰 변환을 표현하십시오 정보. – axel22

관련 문제