具有以下定义:
class Test {
var activated: Boolean = false
}
def maybeTest(): Test = {
if(...) {
val res = new Test
if(...) res.activated = true
} else null
}
我有很多像这样的if
结构:
val myobject = maybeTest()
if(myobject != null && myobject.activated) {
// Do something that does not care about the object
}
我想稍微凝结一下。有没有一种很好的方法来定义/写这样的东西来避免nullPointerException:
if(maybeTest() &&> (_.activated)) {
...
}
在scala中实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
您可以将此类代码包装在Option中,如下所示:
class Test(num: Int) {
def someNum = num
}
val test: Test = null
Option(test).map(t => t.someNum)
在此示例中,如果您的变量为null,那么您将获得None,否则只使用Some(value)
<强>更新强>
如果您不想使用Option,则可以定义此类函数
class Test(num: Int) {
def give = num
}
def ifDefAndTrue[T, K](obj: T)(ifTrue: T => Boolean)(then: => K) {
if (obj != null && ifTrue(obj))
then
}
在你的情况下,这看起来像这样:
val test = new Test // assuming that activated is false
ifDefAndTrue(test)(_.activate) {
println("results in unit")
}
但它包含副作用而不是功能
答案 1 :(得分:1)
怎么样
for {m <- Option(maybeTest())
if m.activated
}
{
... // do something with non-null, activated, m
}
答案 2 :(得分:0)
找到了隐式类的最佳方法,它可以正确处理null情况(虽然它可能不是最有效的方法)。
implicit class CheckNull[T](obj: T) {
def call(f: T => Unit): Unit = if(obj != null) f(obj) else ()
def is(f: T => Boolean): Boolean = if(obj != null) f(obj) else false
}
所以我可以写一个类型安全的方法甚至调用:
if(maybeTest() is (_.activated)) {
...
}
myObjectMaybeNull call (_.pause())
请注意(_.activated)
周围的括号是必要的。