scala代码之-并行执行par 和 延迟加载view
在scala中Stream类型的tail方法是延迟lazy加载的,每调用一次tail方法,都会按照给定的规则创建一个新的流Stream
1 view延迟加载执行
package com.shufang.funs
import scala.collection.SeqView
object ViewToLazyDemo {
def main(args: Array[String]): Unit = {
val list = List(101, 20, 303)
def isThat(i:Int):Boolean={
println("被调用")
i.toString.equals(i.toString.reverse)
}
//使用view来实现延迟lazy加载,在调用方法之前使用view,只有当使用返回结果时才执行调用代码
val value: SeqView[Int, List[Int]] = list.view.filter(isThat)
/**
* 被调用
* 101
* 被调用
* 被调用
* 303
*/
for (elem <- value) {
println(elem)
}
}
}
2 par并行执行
package com.shufang.funs
/**
* 1)Scala为了充分使用多核CPU,提供了并行集合(有别于前面的串行集合),用于多核环境的并行计算。
*
* 2)主要用到的算法有:
* Divide and conquer : 分治算法,Scala通过splitters(分解器),combiners(组合器)等抽象层来实现,
* 主要原理是将计算工作分解很多任务,分发给一些处理器去完成,并将它们处理结果合并返回;
*
* Work stealin算法【学数学】,主要用于任务调度负载均衡(load-balancing),
* 通俗点完成自己的所有任务之后,发现其他人还有活没干完,主动(或被安排)帮他人一起干,这样达到尽早干完的目的
*/
object ParUsage {
def main(args: Array[String]): Unit = {
/**
* par这个方法表示并行执行打印操作,交给不同的线程打印
* view这个方法代表将之后的方法延迟执行,直到调用该方法的结果时才执行代码块
*/
(1 to 5).foreach(print(_)) // 12345 串行执行
println()
(1 to 5).par.foreach(print(_)) // 42513 并行执行
}
}
版权声明:本文为shufangreal原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。