0

具有以下定义:

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

4

3 回答 3

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")
}

但它包含副作用并且没有功能

于 2013-04-25T09:18:42.197 回答
1

怎么样

for {m <- Option(maybeTest())
     if m.activated
    }
    {
        ... // do something with non-null, activated, m
    }
于 2013-09-18T15:16:20.493 回答
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)是必要的。

于 2013-09-17T21:45:23.813 回答