
Seq的操作
特性(trait) Seq 具有兩個子特征(subtrait) LinearSeq和IndexedSeq。它們不添加任何新的操作,但都提供不同的性能特點:線性序列具有高效的 head 和 tail 操作,而索引序列具有高效的apply, length, 和 (如果可變) update操作。
Buffers是可變序列一個重要的種類。ListBuffer和ArrayBuffer是常用的buffer實現 。
集合:
集合是不包含重復元素的可迭代對象。
val fruit=Set("apple","orange","peach","banana")fruit: scala.collection.immutable.Set[java.lang.String]=Set(apple, orange, peach, banana)scala> fruit("peach")res0:Boolean=truescala> fruit("potato")res1:Boolean=false可變集合操作:有序集(SortedSet)SortedSet 是指以特定的順序(這一順序可以在創建集合之初自由的選定)排列其元素(使用iterator或foreach)的集合。
位集合(Bitset)位集合是由單字或多字的緊湊位實現的非負整數的集合。
映射映射(Map)是一種可迭代的鍵值對結構(也稱映射或關聯)。允許使用另一種語法:key -> value,來代替(key, value)。如:Map("x" -> 24, "y" -> 25, "z" -> 26)等同于Map(("x", 24), ("y", 25), ("z", 26)),卻更易于閱讀。
getOrElseUpdate特別適合用于訪問用作緩存的映射(Map)
同步集合(Set)和映射(Map)無論什么樣的Map實現,只需混入SychronizedMap trait,就可以得到對應的線程安全版的Map。
import scala.collection.mutable.{Map,SynchronizedMap,HashMap}objectMapMaker{def makeMap:Map[String,String]={newHashMap[String,String]withSynchronizedMap[String,String]{overridedefdefault(key:String)="Why do you want to know?"}}}makeMap方法返回的可變映射混入了 SynchronizedMap trait,因此可以用在多線程環境下。對該映射的每次訪問都是同步的。具體的不可變集實體類:
List(列表)列表List是一種有限的不可變序列式
兩種構造方式:
// List of Integersval nums: List[Int] = List(1, 2, 3, 4)// List of Integersval nums = 1 :: (2 :: (3 :: (4 :: Nil)))可以使用:::運算符或列表List.:::()方法或List.concat()方法來添加兩個或多個列表Stream(流)流Stream與List很相似,只不過其中的每一個元素都經過了一些簡單的計算處理。也正是因為如此,stream結構可以無限長。
斐波那契數列的定義是,序列中的每個元素等于序列中在它之前的兩個元素之和。
scala> def fibFrom(a: Int, b: Int): Stream[Int] = a #:: fibFrom(b, a + b)fibFrom: (a: Int,b: Int)Stream[Int]這段程序最大的亮點是在對序列進行計算的時候避免了無限遞歸。如果函數中使用::來替換#::,那么之后的每次調用都會產生另一次新的調用,從而導致無限遞歸。scala> val fibs = fibFrom(1,1).take(7)fibs: scala.collection.immutable.Stream[Int]=Stream(1,?)scala> fibs.toListres9:List[Int]=List(1,1,2,3,5,8,13)Vector向量用來解決List不能高效的進行隨機訪問的一種結構。scala> val vec = scala.collection.immutable.Vector.emptyvec: scala.collection.immutable.Vector[Nothing] = Vector()scala> val vec2 = vec :+ 1 :+ 2vec2: scala.collection.immutable.Vector[Int] = Vector(1, 2)Vector的元素不可更改,但可用update 新生成。Immutable stacks(不可變棧Immutable Queues(不可變隊列)Ranges (等差數列)scala> 5 to 14 by 3res3: scala.collection.immutable.Range = Range(5, 8, 11, 14)scala> 1 until 3res2: scala.collection.immutable.Range = Range(1, 2)Immutable BitSets(不可變位集合)BitSet代表一個由小整數構成的容器,這些小整數的值表示了一個大整數被置1的各個位。比如說,一個包含3、2和0的bit集合可以用來表示二進制數1101和十進制數13.具有不可變的容器類:Array Buffers一個ArrayBuffer緩沖包含數組和數組的大小。另外,數組緩沖可以進行高效的尾插數據。List BuffersListBuffer 類似于數組緩沖。區別在于前者內部實現是鏈表, 而非數組。如果你想把構造完的緩沖轉換為列表,那就用列表緩沖,別用數組緩沖StringBuilders數組緩沖用來構建數組,列表緩沖用來創建列表。類似地,StringBuilder 用來構造字符串。隊列Scala除了提供了不可變隊列之外,還提供了可變隊列。你可以像使用一個不可變隊列一樣地使用一個可變隊列,但你需要使用+= 和++=操作符進行添加的方式來替代排隊方法。哈希表Hash Table 用一個底層數組來存儲元素,每個數據項在數組中的存儲位置由這個數據項的Hash Code 來決定。所以在Scala中默認的可變map和set都是基于Hash Table的。你也可以直接用mutable.HashSet 和 mutable.HashMap 來訪問它們。數組:1、與Java的數組一致2、是范型,可以創建Array[T]。3、與Seq兼容,可以用Seq的任何方法。總結,泛型數組創建需要類聲明。所以每當創建一個類型參數T的數組,你還需要提供一個T的隱式類聲明。最簡單的方法是聲明類型參數與ClassManifest的上下文綁定,如 [T: ClassManifest]。性能特點:http://docs.scala-lang.org/zh-cn/overviews/collections/performance-characteristics視圖:總之,視圖是協調性能和模塊化的一個強大工具。但為了不被延遲利弊評估方面的糾纏,應該在2個方面對視圖進行約束。要么你將在容器轉換器不產生副作用的純粹的功能代碼里使用視圖。要么你將它們應用在所有的修改都是明確的可變容器。最好的規避就是混合視圖和操作,創建新的根接口,同時消除片面影響。迭代器:迭代器不是一個容器,更確切的說是逐一訪問容器內元素的方法。迭代器it的兩個基本操作是next和hasNext。調用it.next()會返回迭代器的下一個元素,并且更新迭代器的狀態。在同一個迭代器上再次調用next,會產生一個新元素來覆蓋之前返回的元素。如果沒有元素可返回,調用next方法會拋出一個NoSuchElementException異常。在迭代器或traversable容器中調用foreach方法的最大區別是:當在迭代器中完成調用foreach方法后會將迭代器保留在最后一個元素的位置。所以在這個迭代器上再次調用next方法時會拋出NoSuchElementException異常。與此不同的是,當在容器中調用foreach方法后,容器中的元素數量不會變化scala> val it = Iterator("a", "number", "of", "Words")it: Iterator[java.lang.String] = non-empty iteratorscala> it.map(_.length)res1: Iterator[Int] = non-empty iteratorscala> res1 foreach PRintln1625scala> it.next()java.util.NoSuchElementException: next on empty iterator
新聞熱點
疑難解答