在scala中,检查非nullity并直接应用方法?

时间:2013-04-25 09:12:03

标签: scala if-statement nullpointerexception conditional-statements

具有以下定义:

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中实现这一目标的最佳方法是什么?

3 个答案:

答案 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)周围的括号是必要的。