2
我是斯卡拉新手,所以我想了解爲什麼在視圖上的調用返回實例IndexedSeqViewS
和類似的類。爲什麼每個操作需要有不同的課程?爲什麼有這麼多的Scala集合視圖類型?
我是斯卡拉新手,所以我想了解爲什麼在視圖上的調用返回實例IndexedSeqViewS
和類似的類。爲什麼每個操作需要有不同的課程?爲什麼有這麼多的Scala集合視圖類型?
由於每個視圖變換操作(即生成新視圖的操作(如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
(以及其他方法,如apply
,size
等),需要引入一個子類。在一些替代設計中,例如一個基於類型類,可能需要引入一個單獨的類型類來重新定義特定類型的foreach
。
每個'Stream [T]'操作有單獨的類嗎? –
不,每個'Stream'操作只有2個類 - 空流和流缺點。但是,這些操作總是返回一個'Stream' - 並且每個流都使用相同的'foreach'實現。 '* View'操作是集合獨立的 - 視圖鏈中底層集合('foreach')的遍歷根據之前調用的操作而變化 - 以及其他訪問器操作(如'reduce','' foreach'或'copyToArray')是按照'foreach'來實現的。 – axel22
如果要包含關於所有可能的視圖轉換的所有信息,即可以用一個大的flatMapFilterGroupBySlice方法來表示所有視圖轉換,這可以體現所有可能的轉換信息。 – axel22