2013-04-17 64 views

回答

3

由於每個視圖變換操作(即生成新視圖的操作(如map,filter或)會創建以不同方式遍歷底層集合的視圖。 請注意,IndexedSeqViewS不是該集合類的實際名稱 - 它是toString返回的美化名稱。

例如,Mapped視圖創建底層集合的視圖,以便以某種方式轉換底層集合的每個元素。

這需要重新定義foreach如下:

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

Filtered視圖需要忽略一些元件,同時遍歷:

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

由於集合具有基於繼承的設計,要覆蓋的定義foreach(以及其他方法,如applysize等),需要引入一個子類。在一些替代設計中,例如一個基於類型類,可能需要引入一個單獨的類型類來重新定義特定類型的foreach

+0

每個'Stream [T]'操作有單獨的類嗎? –

+1

不,每個'Stream'操作只有2個類 - 空流和流缺點。但是,這些操作總是返回一個'Stream' - 並且每個流都使用相同的'foreach'實現。 '* View'操作是集合獨立的 - 視圖鏈中底層集合('foreach')的遍歷根據之前調用的操作而變化 - 以及其他訪問器操作(如'reduce','' foreach'或'copyToArray')是按照'foreach'來實現的。 – axel22

+0

如果要包含關於所有可能的視圖轉換的所有信息,即可以用一個大的flatMapFilterGroupBySlice方法來表示所有視圖轉換,這可以體現所有可能的轉換信息。 – axel22

相關問題