【发布时间】:2015-12-01 10:00:26
【问题描述】:
考虑example
object Main extends App {
case class ref(val target: Object)
val map: Map[Int, ref] = Map(1 -> ref(null), 2 -> ref("2"))
//> map : Map[Int,o.ref] = Map(1 -> ref(null), 2 -> ref(2))
def request(id: Int, default: Object) = {
println(map.get(id) map (_.target) match {
case Some(result) => result
case None => default
})
} //> request: (id: Int, default: Object)Unit
request(0, "fixed 0") //> fixed 0
request(1, "fixed 1") //> null
request(2, "fixed 2") //> 2
}
如您所见,option1 的结果为 null。我希望这样的目标能够处理同样的数据库中没有匹配项。如何将Some(null) 转换为None?
【问题讨论】:
-
通常我会查看“目标”值的来源,并将它们包装在
Option中,尽可能接近该点。然后,'null' 值将已经是None,而非空值将是Some(target)。例如,在此调用.map(ref)以获取None/Some(ref),在其上调用.foreach以将条目放入地图中(因此只有当它不是None时才会进入)等等。 -
目标来自弱引用。我不想花费大量内存将所有内容存储在 Option 包装器中。然而,动态转换它的想法是有道理的。