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 № 1Sie 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 wirdNone
wenn der Wert istnull
, oderSome(...)
mit dem Wert sonst - Ähnlich beim Einwickeln von etwas, das eine Ausnahme auslösen kann
Try
wird es entwederFailure
mit der Ausnahme oderSuccess
mit dem Wert toOption
Methode konvertiertTry
zuOption
auf einfache Weise:Failure
wirdNone
,Success
wirdSome
- im Verstehen, wenn irgendein von den vier
Option
s kehrt zurückNone
(d. h. einer von ihnen warnull
Wenn eine Zahl nicht geparst wurde, wird die gesamte Anweisung zurückgegebenNone
und nur wenn jeder von den vier ergibt sich ein Wert, der an den übergeben wirdYellowAccount
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
)
}