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是Account
中的必填字段。你如何以惯用的方式做空检查?
答案 0 :(得分:4)
您可以使用Option
类型来处理null
值。您只需在Option
中包含一个可以为空的值,然后就可以对其进行模式匹配。在您的示例中,我认为组合4个可空值的最简洁方法是for-comprehension:
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)
}
}
修改强>
此处的另一件事是_.toDouble
转换,如果它无法解析字符串,可能会抛出异常,因此您可以将其包装在Try
中(我更新了上面的代码)。
<强> EDIT2 强>
澄清这里发生的事情:
答案 1 :(得分:0)
正如另一个答案所示,您可以使用temp\Win
来处理可能的空值。你不能按照它的建议方式使用Option
理解,但有几种方法可以解决它。最简单的,可能是将for
两个选项放在一起,然后映射结果:
.zip