scala代码之-并行执行par 和 延迟加载view

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版权协议,转载请附上原文出处链接和本声明。