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 是自定义的一个函数,函数名是程序员指定的。

创建的集合的第一个元素是 n , 后续元素生成的规则是 n + 1

后续元素生成的规则是可以程序员指定的 ,比如 numsForm( n * 4)...

使用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的元素并进行一些计算

//创建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

基本介绍

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 操作符

原文地址:https://www.cnblogs.com/qiu-hua/p/13265567.html