Sets and Maps
Prerequisites: Tuples, Lists
Set: unique values
@main def sets(): Unit =
val tags = Set("scala", "jvm", "scala", "fp")
println(tags.size)
println(tags.contains("jvm"))
println(tags + "spark" - "jvm")
val a = Set(1, 2, 3, 4)
val b = Set(3, 4, 5)
println(a intersect b)
println((a union b).toList.sorted)
println(a diff b)
3
true
Set(scala, fp, spark)
Set(3, 4)
List(1, 2, 3, 4, 5)
Set(1, 2)
Duplicates are removed automatically; checking membership is fast. Sets have no guaranteed order.
Map: key-value pairs
@main def maps(): Unit =
val ages = Map("Ada" -> 36, "Linus" -> 28)
println(ages("Ada"))
println(ages.get("Grace"))
println(ages.getOrElse("Grace", 0))
println(ages.contains("Linus"))
val updated = ages + ("Grace" -> 45) - "Linus"
println(updated)
println(updated.keys.toList.sorted)
36
None
0
true
Map(Ada -> 36, Grace -> 45)
List(Ada, Grace)
ages("Ada")looks up a key — and throws if it's missing.getreturns anOption:Some(value)orNone.getOrElsesupplies a default.+and-return new maps.
Looping and transforming
@main def mapOps(): Unit =
val stock = Map("apples" -> 10, "pears" -> 0, "plums" -> 4)
for (item, count) <- stock.toList.sortBy(_._1) do
println(s"$item: $count")
println(stock.filter((_, count) => count > 0).keys.toList.sorted)
val doubled = stock.map((item, count) => item -> count * 2)
println(doubled("plums"))
apples: 10
pears: 0
plums: 4
List(apples, plums)
8
Counting
@main def counting(): Unit =
val words = List("red", "blue", "red", "green", "red", "blue")
val counts = words.groupMapReduce(identity)(_ => 1)(_ + _)
println(counts.toList.sortBy(-_._2))
List((red,3), (blue,2), (green,1))
groupMapReduce groups by a key, maps each element to a value, and
combines the values — a one-line word count.