scala学习总结9(集合的扩展操作)

集合操作扩展
  • 拉链(合并):

    • 基本介绍:当我们需要将两个集合进行 对偶元组合并,可以使用拉链。
    • 实例:
    val list1 = List(1,2,3)
    val list2 = List(9,8,7)
    val list3 = list1.zip(list2)
    println(list3)//(1,9)(2,8)(3,7)
    • 注意事项:
      ①如果两个集合个数不对应,会造成数据丢失。
      ②集合不限于List, 也可以是其它集合比如 Array
      ③拉链的本质就是两个集合的合并操作,合并后每个元素是一个 对偶元组。
      for(item<-list3){ print(item._1 + " " + item._2) //取出 }
  • 迭代器:

    • 基本说明:通过iterator方法从集合获得一个迭代器
    • 遍历操作示例:
val it = List(1,2,3).iterator
//方式一:
while(it.hasNext)
	println(it.next)
//方式二
for (i <- it)
	println(i)
  • 流: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)…

- 视图:View
- 基本介绍:
Stream的懒加载特性,也可以对其他集合应用view方法来得到类似的效果,具有如下特点:
①view方法产出一个总是被懒执行的集合。
②view不会缓存数据,每次都要重新计算,比如遍历View时。

- 示例:请找到1-100 中,数字倒序排列 和它本身相同的所有数。(1 2, 11, 22, 33 ...)
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)
  • 线程安全的集合:
    • 基本介绍:
      所有线程安全的集合都是以Synchronized开头的集合:
    SynchronizedBuffer
    SynchronizedMap
    SynchronizedPriorityQueue
    SynchronizedQueue
    SynchronizedSet
    SynchronizedStack
  • 并行集合:
    • 基本介绍:
      ①Scala为了充分使用多核CPU,提供了并行集合(有别于前面的串行集合),用于多核环境的并行计算。
      ②主要用到的算法有: Divide and conquer : 分治算法,Scala通过splitters(分解器),combiners(组合器)等抽象层来实现,主要原理是将计算工作分解很多任务,分发给一些处理器去完成,并将它们处理结果合并返回
      ②Work stealin算法:主要用于任务调度负载均衡(load-balancing),通俗点完成自己的所有任务之后,发现其他人还有活没干完,主动(或被安排)帮他人一起干,这样达到尽早干完的目的
    • 应用案例:
      ①打印1-5:
    (1 to 5).foreach(println(_))
    println()
    (1 to 5).par.foreach(println(_))
    ②查看并行集合中元素访问的线程
    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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值