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

  • 相关阅读:
    Python机器学习算法 — 关联规则(Apriori、FP-growth)
    Python数据存储 — MySQL数据库操作
    Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)
    七大查找算法(Python)
    react-redux源码学习
    理解webpack4.splitChunks
    redux、immutablejs和mobx性能对比(一)
    前端初探 Gitlab CI/CD
    React SPA 应用 hash 路由如何使用锚点
    理解webpack4.splitChunks之其余要点
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13265567.html
Copyright © 2011-2022 走看看