scala 數據結構(十一):流 Stream、視圖 View、線程安全的集合、並行集合

1 流 Stream

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,?)

2 視圖 View

基本介紹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)

3 線程安全的集合

全部線程安全的集合都是以Synchronized開頭的集合

SynchronizedBuffer
SynchronizedMap
SynchronizedPriorityQueue
SynchronizedQueue
SynchronizedSet
SynchronizedStack

4 並行集合

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)

5 操做符

相關文章
相關標籤/搜索