stream是一個集合。這個集合,能夠用於存放無窮多個元素,可是這無窮個元素並不會一次性生產出來,而是須要用到多大的區間,就會動態的生產,末尾元素遵循lazy規則(即:要使用結果才進行計算的) 。程序員
建立Stream對象算法
def numsForm(n: BigInt) : Stream[BigInt] = n #:: numsForm(n + 1)
val stream1 = numsForm(1)
說明緩存
Stream 集合存放的數據類型是BigInt安全
numsForm 是自定義的一個函數,函數名是程序員指定的。ide
建立的集合的第一個元素是 n , 後續元素生成的規則是 n + 1函數
後續元素生成的規則是能夠程序員指定的 ,好比 numsForm( n * 4)...spa
使用tail,會動態的向stream集合按規則生成新的元素線程
//建立Stream def numsForm(n: BigInt) : Stream[BigInt] = n #:: numsForm(n + 1) val stream1 = numsForm(1) println(stream1) // //取出第一個元素 println("head=" + stream1.head) // println(stream1.tail) // println(stream1) //?
使用map映射stream的元素並進行一些計算code
//建立Stream def numsForm(n: BigInt) : Stream[BigInt] = n #:: numsForm(n + 1) def multi(x:BigInt) : BigInt = { x * x } println(numsForm(5).map(multi)) //? (25,?)
基本介紹orm
Stream的懶加載特性,也能夠對其餘集合應用view方法來獲得相似的效果,具備以下特色:
1)view方法產出一個老是被懶執行的集合。
2)view不會緩存數據,每次都要從新計算,好比遍歷View時。
def multiple(num: Int): Int = { num} def eq(i: Int): Boolean = { i.toString.equals(i.toString.reverse) } //說明: 沒有使用view val viewSquares1 = (1 to 100) .map(multiple) .filter(eq) println(viewSquares1) //for (x <- viewSquares1) {} //使用view val viewSquares2 = (1 to 100) .view .map(multiple) .filter(eq) println(viewSquares2)
全部線程安全的集合都是以Synchronized開頭的集合
SynchronizedBuffer
SynchronizedMap
SynchronizedPriorityQueue
SynchronizedQueue
SynchronizedSet
SynchronizedStack
1)Scala爲了充分使用多核CPU,提供了並行集合(有別於前面的串行集合),用於多核環境的並行計算。
2)主要用到的算法有: Divide and conquer : 分治算法,Scala經過splitters(分解器),combiners(組合器)等抽象層來實現,主要原理是將計算工做分解不少任務,分發給一些處理器去完成,並將它們處理結果合併返回
應用案例
1)打印1~5
2)查看並行集合中元素訪問的線程
val result1 = (0 to 100).map{case _ => Thread.currentThread.getName} val result2 = (0 to 100).par.map{case _ => Thread.currentThread.getName} println(result1) println(result2)