不可變與可變容器(Container)




因為Scala致力於幫助你充分利用函數式和指令式風格兩方面的好處,它的集合類型庫於是就區分了集合類的可變和不可變。例如,陣列始終是可變的,而列表 始終不可變。當問題討論到集和映射,Scala同樣提供了可變和不可變的替代品,不過用了不同的辦法。對於集和映射,Scala把可變性建模在類繼承中。

  1. 容器類別不可透過 new 實例化
  2. 隱式推繼為 不可變(Immutable)集合
  3. 欲使用 可變集合 必須顯式 import


+=


要向集加入新的變量,可以在集上調用+,傳入新的元素。可變的和不可變的集都提供了+方法,但它們的行為不同。可變集將把元素加入自身,不可變集將創建並 返回一個包含了添加元素的新集。你使用的是不可變集,因此+調用將產生一個全新集。因此儘管可變集提供的實際上是+=方法,不可變集卻不是。



特質: trait (Keyword)


  • Scala 的 API 包含了集的一個基本特質:trait,特質這個概念接近於Java的 介面(接口, interface)
  • Scala 於是提供了兩個子特質,一個是可變的集,另一個是 不可變的集。
  • Scala 的API 裡具體的集合類別擴展(extands)了要麼是可變的,要麼不可變的集合特質。(儘管Java裡面稱為「實作」了介面,在Scala裡面稱為「擴展」或「混入」了特質。)因此,如果你想要使用集合,你可以根據你的需要選擇可變的或不可變的變體。

Package scala.collection


  • trait Set
  • trait Map

Pakcages


  • scala.collection.immutable
  • scala.collection.mutable



trait Map[A, +B]
extends PartialFunction[A, B] with Collection[(A, B)]

A map is a collection that maps each key to one or zero values.

This trait provides a limited interface, only allowing reading of elements. There are two extensions of this trait, in packages scala.collection.mutable and scala.collection.immutable, which provide functionality for adding new key/value mappings to a map. The trait in the first package is for maps that are modified destructively, whereas the trait in the second package is for immutable maps which create a new map when something is added or removed from them.


trait Set[A]
extends (A) => Boolean with Collection[A]

A set is a collection that includes at most one of any object.

This trait provides a limited interface, only allowing reading of elements. There are two extensions of this trait, in packages scala.collection.mutable and scala.collection.immutable, which provide functionality for adding and removing objects from the set. The trait in the first package is for sets that are modified destructively, whereas the trait in the second package is for immutable sets which create a new set when something is added or removed to them.




Comments