scalabeginner

Advanced Map Operations

Advanced Map usage: merge, transform, groupMapReduce, default values, and nested maps.

scala
@main def run(): Unit =
  val prices = Map("apple" -> 1.50, "banana" -> 0.75, "cherry" -> 2.00)

  // Transform values
  val doubled = prices.view.mapValues(_ * 2).toMap
  println(s"Doubled: $doubled")

  // Filter
  val expensive = prices.filter((_, v) => v > 1.0)
  println(s"Expensive: $expensive")

  // Map entries
  val formatted = prices.map((k, v) => k.capitalize -> f"$$$v%.2f")
  println(s"Formatted: $formatted")

  // Merge maps
  val stock1 = Map("apple" -> 10, "banana" -> 5)
  val stock2 = Map("banana" -> 3, "cherry" -> 8)
  // Last wins
  val merged = stock1 ++ stock2
  println(s"\nMerged (last wins): $merged")

  // Sum values on conflict
  val summed = (stock1.toSeq ++ stock2.toSeq)
    .groupMapReduce(_._1)(_._2)(_ + _)
  println(s"Summed: $summed")

  // Default values
  val withDefault = prices.withDefaultValue(0.0)
  println(s"\nKnown: ${withDefault("apple")}")
  println(s"Unknown: ${withDefault("mango")}")

  // getOrElse
  val safeGet = prices.getOrElse("mango", -1.0)
  println(s"GetOrElse: $safeGet")

  // Nested maps / groupBy
  val people = List(
    ("Alice", "Engineering", 95000),
    ("Bob", "Engineering", 85000),
    ("Carol", "Marketing", 75000),
    ("Dave", "Marketing", 80000),
    ("Eve", "Engineering", 90000)
  )

  val byDept = people.groupBy(_._2)
  println(s"\nBy department:")
  byDept.foreach { (dept, members) =>
    println(s"  $dept: ${members.map(_._1).mkString(", ")}")
  }

  // groupMapReduce: group, map, reduce in one pass
  val avgSalary = people
    .groupMapReduce(_._2)(p => (p._3.toDouble, 1)) {
      case ((sum1, c1), (sum2, c2)) => (sum1 + sum2, c1 + c2)
    }
    .view.mapValues((sum, count) => sum / count)
    .toMap
  println(s"\nAvg salary: $avgSalary")

  // Sorted maps
  import scala.collection.immutable.SortedMap
  val sorted = SortedMap.from(prices)
  println(s"\nSorted: $sorted")

  // Map operations
  println(s"\nKeys: ${prices.keys.toList}")
  println(s"Values: ${prices.values.toList}")
  println(s"Contains: ${prices.contains("apple")}")
  println(s"Size: ${prices.size}")

  // Collect / partial function on map
  val deals = prices.collect {
    case (name, price) if price < 1.0 => s"$name on sale!"
  }
  println(s"Deals: $deals")

  // Fold map
  val totalValue = prices.foldLeft(0.0)((acc, kv) => acc + kv._2)
  println(f"Total: $$$totalValue%.2f")

  // Invert map (swap keys and values)
  val inverted = prices.map(_.swap)
  println(s"Inverted: $inverted")

Use Cases

  • Data aggregation and grouping
  • Configuration management
  • Lookup table operations

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.