Table of Contents
This is an excerpt from the Scala Cookbook (partially modified for the internet). This is Recipe 11.29, “How to Use a Queue in Scala”
Problem
You want to use a queue data structure in a Scala application.
Solution
A queue is a first-in, first-out (FIFO) data structure. Scala offers both an immutable queue and mutable queue. This recipe demonstrates the mutable queue.
You can create an empty, mutable queue of any data type:
import scala.collection.mutable.Queue var ints = Queue[Int]() var fruits = Queue[String]() var q = Queue[Person]()
You can also create a queue with initial elements:
scala> val q = Queue(1, 2, 3) q: scala.collection.mutable.Queue[Int] = Queue(1, 2, 3)
Add elements with +=, ++=, enqueue
Once you have a mutable queue, add elements to it using +=
, ++=
, and enqueue
, as shown in the following examples:
scala> import scala.collection.mutable.Queue import scala.collection.mutable.Queue // create an empty queue scala> var q = new Queue[String] q: scala.collection.mutable.Queue[String] = Queue() // add elements to the queue in the usual ways scala> var q = new Queue[String] q: scala.collection.mutable.Queue[String] = Queue() scala> q += "apple" res0: scala.collection.mutable.Queue[String] = Queue(apple) scala> q += ("kiwi", "banana") res1: scala.collection.mutable.Queue[String] = Queue(apple, kiwi, banana) scala> q ++= List("cherry", "coconut") res2: scala.collection.mutable.Queue[String] = Queue(apple, kiwi, banana, cherry, coconut) // can also use enqueue scala> q.enqueue("pineapple") scala> q res3: scala.collection.mutable.Queue[String] = Queue(apple, kiwi, banana, cherry, coconut, pineapple)
dequeue
Because a queue is a FIFO, you typically remove elements from the head of the queue, one element at a time, using dequeue
:
// take an element from the head of the queue scala> val next = q.dequeue next: String = apple // 'apple' is removed from the queue scala> q res0: scala.collection.mutable.Queue[String] = Queue(kiwi, banana, cherry, coconut, pineapple) // take the next element scala> val next = q.dequeue next: String = kiwi // 'kiwi' is removed from the queue scala> q res1: scala.collection.mutable.Queue[String] = Queue(banana, cherry, coconut, pineapple)
dequeueFirst, dequeueAll
You can also use the dequeueFirst
and dequeueAll
methods to remove elements from the queue by specifying a predicate:
scala> q.dequeueFirst(_.startsWith("b")) res2: Option[String] = Some(banana) scala> q res3: scala.collection.mutable.Queue[String] = Queue(cherry, coconut, pineapple) scala> q.dequeueAll(_.length > 6) res4: scala.collection.mutable.Seq[String] = ArrayBuffer(coconut, pineapple) 11.29. Using a Queue | 373 scala> q res5: scala.collection.mutable.Queue[String] = Queue(cherry)
A Queue
is a collection class that extends from Iterable
and Traversable
, so it has all the usual collection methods, including foreach
, map
, etc. See the Queue
Scaladoc for more information.
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |