Return a missing-safe result from a lookup.

safe-lookup A lookup can return an `Option` instead of a raw value. The caller turns it into a status label and a safe default with `isDefined` and `getOrElse`.

Safe Lookup

key
SafeLookup.scala
Replay: real traced execution (multi-file project)
object Main {
  def main(args: Array[String]): Unit = {
    val key = "b"
    var found: Option[Int] = None
    if (key == "a") {
      found = Some(10)
    }
    if (key == "b") {
      found = Some(20)
    }

    val status = if (found.isDefined) "hit" else "miss"
    val result = found.getOrElse(-1)

    println("key=" + key)
    println("status=" + status)
    println("result=" + result)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val key = "a"
    var found: Option[Int] = None
    if (key == "a") {
      found = Some(10)
    }
    if (key == "b") {
      found = Some(20)
    }

    val status = if (found.isDefined) "hit" else "miss"
    val result = found.getOrElse(-1)

    println("key=" + key)
    println("status=" + status)
    println("result=" + result)
  }
}
object Main {
  def main(args: Array[String]): Unit = {
    val key = "z"
    var found: Option[Int] = None
    if (key == "a") {
      found = Some(10)
    }
    if (key == "b") {
      found = Some(20)
    }

    val status = if (found.isDefined) "hit" else "miss"
    val result = found.getOrElse(-1)

    println("key=" + key)
    println("status=" + status)
    println("result=" + result)
  }
}
  1. key ← b, found ← None

    1object Main {2  def main(args: Array[String]): Unit = {3    val key→ b = "b" //@key="a", "z"4    var found→ None: Option[Int] = None5    if (key == "a") {6      found = Some(10)
  2. found ← Some(20)

    7}8if (keyb == "b") {9  found→ Some(20) = Some(20)10}
  3. status ← hit, result ← 20

    12    val status→ hit = if (found.isDefinedtrue) "hit" else "miss"13    val result→ 20 = foundSome(20).getOrElse(-1)1415    println("key=" + keyb)16    println("status=" + statushit)17    println("result=" + result20)18  }19}
    outputkey=b
    status=hit
    result=20
  1. key ← a, found ← None

    1object Main {2  def main(args: Array[String]): Unit = {3    val key→ a = "a"4    var found→ None: Option[Int] = None5    if (key == "a") {6      found = Some(10)
  2. found ← Some(10)

    4var found: Option[Int] = None5if (keya == "a") {6  found→ Some(10) = Some(10)7}8if (key == "b") {
  3. status ← hit, result ← 10

    12    val status→ hit = if (found.isDefinedtrue) "hit" else "miss"13    val result→ 10 = foundSome(10).getOrElse(-1)1415    println("key=" + keya)16    println("status=" + statushit)17    println("result=" + result10)18  }19}
    outputkey=a
    status=hit
    result=10
  1. key ← z, found ← None, status ← miss, result ← -1

    1object Main {2  def main(args: Array[String]): Unit = {3    val key→ z = "z"4    var found→ None: Option[Int] = None5    if (key == "a") {6      found = Some(10)7    }8    if (key == "b") {9      found = Some(20)10    }1112    val status→ miss = if (found.isDefinedfalse) "hit" else "miss"13    val result→ -1 = foundNone.getOrElse(-1)1415    println("key=" + keyz)16    println("status=" + statusmiss)17    println("result=" + result-1)18  }19}
    outputkey=z
    status=miss
    result=-1