zoukankan      html  css  js  c++  java
  • 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 操作符

  • 相关阅读:
    gulp学习笔记1
    2017年秋季校招前端面经(百度,腾讯,网易,华为,乐视等)
    前端面试笔试知识汇总3(含答案)
    前端面试笔试知识汇总2(含答案)
    前端面试笔试知识汇总1(含答案)
    一些新的web性能优化技术
    一个简单的无限滚动的加载数据实现
    正则和字符串之间的关系梳理
    数据结构——二叉树的知识点总结
    秋招笔试碰到的疑难题目2
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13265567.html
Copyright © 2011-2022 走看看