/ / Wie kann ich in Scala idiomatisch Nullprüfungen durchführen? - Scala

Wie man in Scala idiomatisch Null-Checks durchführt? - Scala

case class Account(
val name: String,
val uuid: String,
val lat: Double,
val lng: Double
)
}

object Account {
def create(row: Row): Option[YellowAccount] = {
val name = row.getAs[String]("store_name")
val uuid = row.getAs[String]("uuid")
val latO = row.getAs[String]("latitude")
val lngO = row.getAs[String]("longitude")

// How do you do null checks here in an idiomatic way?
if (latO == null || lngO == null) {
return None
}

Some(YellowAccount(name, uuid, latO.toDouble, lngO.toDouble))
}

}

lat / long sind Pflichtfelder in Account. Wie führen Sie Nullprüfungen auf idiomatische Weise durch?

Antworten:

4 für die Antwort № 1

Sie können verwenden Option Typ zu handhaben null Werte. Sie wickeln einfach einen nullbaren Wert in ein Option und dann können Sie darauf ein Muster abgleichen oder etwas anderes. In Ihrem Beispiel denke ich, dass der einfachste Weg, 4 nullwerte Werte zu kombinieren, Verständnis ist:

import scala.util.Try

object Account {
def create(row: Row): Option[YellowAccount] = {
for {
name <- Option( row.getAs[String]("store_name") )
uuid <- Option( row.getAs[String]("uuid") )
latO <-    Try( row.getAs[String]("latitude").toDouble ).toOption
lngO <-    Try( row.getAs[String]("longitude").toDouble ).toOption
} yield
YellowAccount(name, uuid, latO, lngO)
}
}

BEARBEITEN

Eine andere Sache ist hier _.toDouble Die Konvertierung kann eine Ausnahme auslösen, wenn die Zeichenfolge nicht analysiert werden kann Try stattdessen (ich habe den Code oben aktualisiert).

EDIT2

Um zu klären, was hier los ist:

  • wenn Sie einen Wert einschließen Option es wird None wenn der Wert ist null, oder Some(...) mit dem Wert sonst
  • Ähnlich beim Einwickeln von etwas, das eine Ausnahme auslösen kann Trywird es entweder Failure mit der Ausnahme oder Success mit dem Wert
  • toOption Methode konvertiert Try zu Option auf einfache Weise: Failure wird None, Success wird Some
  • im Verstehen, wenn irgendein von den vier Options kehrt zurück None (d. h. einer von ihnen war null Wenn eine Zahl nicht geparst wurde, wird die gesamte Anweisung zurückgegeben Noneund nur wenn jeder von den vier ergibt sich ein Wert, der an den übergeben wird YellowAccount Konstrukteur

0 für die Antwort № 2

Wie die andere Antwort vorschlägt, können Sie verwenden Option um mögliche Nullen zu behandeln. Sie können nicht verwenden for Verständnis, wie es dort vorgeschlagen wird, aber es gibt mehrere Möglichkeiten. Am einfachsten ist es wahrscheinlich zu .zip die beiden Optionen zusammen und ordnen Sie dann das Ergebnis zu:

  Option(row.getAs[latitude])
.zip(Option(row.getAs[String]("longitude")))
.map { case (lat, long) =>
YellowAccount(
row.getAs[String]("store_name"),
row.getAs[String]("uuid"),
lat.toDouble,
long.toDouble
)
}