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)