1. Scala队列
1,1 Scala Queen 定义
- Scala 同 Java 一样,已经直接给出了 Queue 的实现。它本质上是一个有序列表,在底层可以使用数组或者链表去实现。
- Queue 显然遵循
先入先出 的原则。Scala 同时给出了对于队列的 mutable 实现和 immutable 实现。对于不可变队列,进行操作后会返回新的队列;对于可变队列,进队出队操作是在原先的队列中进行的。
mutable.Queue[Any](1,2,3,4,5,6,7)
new mutable.Queue[Any]()
1.2 在Queen中添加新元素
- 可变的 Queue 支持使用
+= 和 ++= 操作实现类似在 ListBuffer 中介绍过的功能,这里直接以代码形式给出,并在注释上附带上一些要点
queue += 8
queue += ListBuffer[String]("a","b","c")
queue ++= ListBuffer[Int](8,9,10)
1.3 Queen的进队和出队
- Queue 还提供
enqueue方法进队 ,以及dequeue出队 方法,可变队列会在原队列中修改,不可变队列会返回新的队列。
val queue: mutable.Queue[Any] = mutable.Queue[Any](1,2,3,4,5,6,7)
queue += 8
println(s"queue head : ${queue.head}")
val first: Any = queue.dequeue()
print(s"popped element: $first")
println(s"queue head : ${queue.head}")
- 另外,可以通过
queue.head来查看队列头的元素内容 ,或者通过queue.last来查看队列尾部元素内容(但都不弹出) 。 Queue 还提供一个独特的方法:queen.tail 。故名思意,就是返回尾部。在队列中,除了第一个 head 元素以外 都可称作尾部(而不是指最后一个元素)。这个方法弹出首元素,然后将剩下的元素排列成一个新队列返回。更通俗点说,enqueue是取 “头” ,则 tail 是去掉 “头” 之后剩下的 “躯干” 部分。
print(ints.head)
val newInts : mutable.Queue[Int] = ints.tail
println(newInts)
println(ints)
tail 方法的返回值也是一个队列,因此可以级联调用该方法,让它一次性弹出多个元素。
val ints: mutable.Queue[Int] = mutable.Queue[Int](1,2,3,4,5)
val newInts : mutable.Queue[Int] = ints.tail.tail.tail.tail
print(newInts)
- 使用下标访问的方式越过 FIFO 的原则直接访问元素其实也完全没有问题,因为Scala 将 Queue 划分到了线性序列中。不过既然使用了队列,就应该尽量按照队列先进先出的原则去使用它。
println(ints(1))
2. 并行集合
- Scala 为了充分使用多核 CPU,提供了并行集合(有别于前面的串行集合),用于多核环境的并行计算。
object TestPar {
def main(args: Array[String]): Unit = {
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)
}
}
|