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 操作符
scala 数据结构(十一):流 Stream、视图 View、线程安全的集合、并行集合的更多相关文章
- Scala数据结构
Scala数据结构 主要的集合特质 Scala同时支持可变集合和不可变集合,优先采用不可变集合.集合主要分为三大类:序列(List),集(set),映射(map).所有的集合都扩展自Iterable特 ...
- 11. Scala数据结构(下)-集合操作
11.1 集合元素的映射-map映射操作 11.1.1 看一个实际需求 要求:请将List(3,5,8)中所有的元素都*2,将其结果放到一个新的集合中返回,即返回一个新的List(6,10,16),请 ...
- MySQL视图view/存储过程和函数的使用
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p. ...
- Java中的函数式编程(八)流Stream并行编程
写在前面 在本系列文章的第一篇,我们提到了函数式编程的优点之一是"易于并发编程". Java作为一个多线程的语言,它通过 Stream 来提供了并发编程的便利性. 题外话: 严格来 ...
- 使用mvc时,在视图view中使用强类型视图,在web.config文件中添加命名空间namespace的引用不起作用,解决方法
这是view中的model代码: @model t_user_info 这是web.config配置文件只的代码: <namespaces> <add namespace=" ...
- SQL Server 索引(index) 和 视图(view) 的简单介绍和操作
--索引(index)和视图(view)-- --索引(index)----概述: 数据库中的索引类似于书籍的目录,他以指针形式包含了表中一列或几列组合的新顺序,实现表中数据库的逻辑排序.索引创建在数 ...
- UIViewController的生命周期(根视图view从无到有的过程)
UIViewController的生命周期实质上是指根视图view从无到有的过程 1.首先新建一个工程:不从mainstoryBoard加载 (删除入口) 在AppDelegate.m --> ...
- 视图(View)与部分视图(Partial View)之间数据传递
写ASP.NET MVC程序,我们经常需要把数据从视图(View)传递至部分视图(Partial View) 或者相反. 今天Insus.NET使用 ControllerBase.TempData 进 ...
- MVC中视图View向控制器传值的方法
MVC中视图View向控制器传值的方法步骤如下: 1.index页面: 页面中只需要一个触发事件的按钮
随机推荐
- ubuntu12.04 dnw2 fl2440 配置
1.安装libusb-dev sudo apt-get install libusb-dev 2.dnw2编译配置 源码如下,将其保存为dnw2.c 编译命令 gcc dnw2.c -o dnw2 - ...
- Say Something About Of Flash Android
Why am I need say something about of flash android? It's at my college life when I touch flash andro ...
- Sublime Text 3.1 注册码
加入到hosts文件: 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com hosts 文件的位置: Windows : c:/ ...
- Eureka加了secsecurity后注册失败
报错信息: com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known ...
- 快捷键浏览存储过程的内容(执行文中的User Store Proc,设置快捷方式的指向usp_Name)
虽然不常用,但使用时还是在用传统方法查看存储过程的内容, sp_helptext usp_Name;下面这段执行后可设置快捷查询usp的内容(但是需要在每个数据库下都存在,不能直接在master,并且 ...
- android中获取其他应用的SharedPreferences
在android中获取其他应用的SharedPreferences,需要其他应用设置的Mode为MODE_WORLD_READABLE或者MODE_WORLD_WRITABLE两种模式.要获取其他应用 ...
- vue事件修饰符与按钮修饰符
事件修饰符:(当事件无需传参数时可直接写成以下形式,有参数时则为@click.stop="handleLiClick($event)") stop:阻止事件冒泡行为(子元素被点击, ...
- Java并发编程的艺术(一、二章) ——学习笔记
第一章 并发编程的挑战 需要了解的一些概念 转自 https://blog.csdn.net/TzBugs/article/details/80921351 (1) 同步VS异步 同步和异步通常用来 ...
- cb03a_c++_数据结构_顺序容器_STL_stack
/*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...
- C# WPF - MVVM实现OPC Client管理系统
前言 本文主要讲解采用WPF MVVM模式设计OPC Client的过程,算作对于WPF MVVM架构的学习记录吧!不足之处请不吝赐教,感谢! 涉及知识点 C#基础 Xaml基础 命令.通知和数据绑定 ...