A random Scala note.
Today, I wanted to apply a list of filters to each item in a list, and return just those that pass each of the filters.
For example, given a range of integers, return just those that are divisible by 2 and by 3.
Let’s start by defining a boolean function divides:
def divides(d:Int,i:Int) = if (i%d==0) true else false
Note that divides(2,_:Int) defines the (partial) function for division by 2.
(divides(2,_:Int))(2) => true
(divides(2,_:Int))(3) => false
So we can create our filters so:
val filters = divides(2,_:Int) :: divides(3,_:Int) :: Nil
val filters = List(divides(2,_:Int),divides(3,_:Int))
Now, we can simply use Scala’s filter and forall functions to filter a range of integers:
scala> Range(1,50).filter(x => filters.forall(f => f(x)))
res45: scala.collection.immutable.IndexedSeq[Int] =
Vector(6, 12, 18, 24, 30, 36, 42, 48)
The filters could also be defined as a Set, but by creating them as a List, one can put the less expensive filters first.