TPriorityQueue

TPriorityQueue[A] 是一个可以参与 STM 事务的可变队列。一个 TPriorityQueue 中包含了类型为 A 的带有顺序定义的值。与 TQueue 不同,take 返回的是最高优先级(指定顺序中的第一个)值,而不是队列中的第一个值。当从队列中取出时,不保证共享相同优先级的元素的顺序。

创建一个 TPriorityQueue

您可以使用 empty 函数创建一个空的 TPriorityQueue

import zio._
import zio.stm._

val minQueue: STM[Nothing, TPriorityQueue[Int]] =
  TPriorityQueue.empty

请注意,TPriorityQueue 的创建使用了隐式 Ordering。默认情况下,take 将返回指定顺序中第一个的值。例如,在按时间排序的事件队列中,最早的事件将被首先取出。如果您想要不同的行为,可以使用自定义的 Ordering

val maxQueue: STM[Nothing, TPriorityQueue[Int]] =
  TPriorityQueue.empty(Ordering[Int].reverse)

您还可以使用 fromIterablemake 构造函数创建一个使用指定元素初始化的TPriorityQueuefromIterable 构造函数采用 Iterable,而 make 构造函数采用可变参数元素序列。

向 TPriorityQueue 添加元素

您可以使用 offerofferAll 方法将元素添加入 TPriorityQueue。如果您要同时向队列添加多个元素,则 offerAll 方法会更加高效。

val queue: STM[Nothing, TPriorityQueue[Int]] =
  for {
    queue <- TPriorityQueue.empty[Int]
    _     <- queue.offerAll(List(2, 4, 6, 3, 5, 6))
  } yield queue

从 TPriorityQueue 中获取元素

使用 takeTPriorityQueue 中获取一个元素。take 在语义上会阻塞,直到队列中至少要取一个值为止。您还可以使用 takeAll 立即获取队列中当前的所有值,或使用 takeUpTo 立即获取队列中指定数量的元素。

val sorted: STM[Nothing, Chunk[Int]] =
  for {
    queue  <- TPriorityQueue.empty[Int]
    _      <- queue.offerAll(List(2, 4, 6, 3, 5, 6))
    sorted <- queue.takeAll
  } yield sorted

您也可以使用 takeOption 方法从队列中获取第一个值(如果不存在也不会被挂起),或者使用 peek 方法观察队列中的第一个元素(如果存在)而不将其从队列中删除。

有时,您想要对队列的当前状态进行快照而不修改它。为此,toChunk 组合器或其变体 toListtoVector 非常有用。这些函数将返回一个不可变的集合,该集合由当前队列中的所有元素组成,而队列的状态保持不变。

TPriorityQueue 的大小

您可以使用 size 方法检查 TPriorityQueue 的大小:


val size: STM[Nothing, Int] =
  for {
    queue <- TPriorityQueue.empty[Int]
    _     <- queue.offerAll(List(2, 4, 6, 3, 5, 6))
    size  <- queue.size
  } yield size
Leave a Reply
Your email address will not be published.
*
*

BACK TO TOP