Encadenar Options en Scala
Dos búsquedas dependientes y una condición, sin un solo chequeo de null.
val owners: Map[String, String] = Map("orders" -> "ada", "billing" -> "grace")
val inboxes: Map[String, String] = Map("ada" -> "Ada@Example.COM")
// flatMap threads one Option-returning step into the next, and map
// transforms the value inside. Two nested null checks become one line.
def inboxFor(team: String): Option[String] =
owners.get(team).flatMap(inboxes.get).map(_.toLowerCase)
// filter keeps the value only when the test passes, else gives None.
def companyInbox(team: String): Option[String] =
inboxFor(team).filter(_.endsWith("@example.com"))
// fold unwraps both cases at once: the default first, then the transform.
def contactLine(team: String): String =
companyInbox(team).fold("no company contact")(mail => s"write to $mail")
Cómo funciona
owners.get(team).flatMap(inboxes.get)mete una búsqueda directo en la siguiente..map(_.toLowerCase)entra dentro del Option, yfilterdescarta el valor si_.endsWith("@example.com")falla.folddesenvuelve ambos casos a la vez, tomando el defaultno company contactantes de transformar.
Palabras clave y builtins usados aquí
defval
El intento, en números
- Líneas
- 15
- Caracteres a escribir
- 747
- Tokens
- 128
- Ritmo de tres estrellas
- 65 tpm
Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 118 segundos.
Paso 2 de 3 en Option y Either; paso 20 de 27 en Fundamentos del lenguaje.