如何在scala中的单个语句中检查null?

时间:2011-04-21 07:26:57

标签: scala null inline

在我的scala代码中:

QueueManager.add(getObject)

其中getObject是返回类型为QueueObject的对象的方法。

def getObject : QueuObject = {
    val response = //some response
    return response
}

有没有办法在添加QueueObject的同时检查响应为null?我知道我可以这样做:

if (getObject != null)
    QueueManager.add(getObject)

但我不想添加一定程度的缩进。是否有一个内联运算符?

感谢。

4 个答案:

答案 0 :(得分:70)

尽量避免在Scala中使用null。它实际上只存在与Java的互操作性。在Scala中,使用Option表示可能为空的内容。如果您正在调用可能返回null的Java API方法,请立即将其包装在Option中。

def getObject : Option[QueueObject] = {
  // Wrap the Java result in an Option (this will become a Some or a None)
  Option(someJavaObject.getResponse)
}

注意:您不需要将其放在val中或使用显式 Scala中的return声明;结果将是价值 块中的最后一个表达式(实际上,因为只有一个语句,所以甚至不需要块)。

def getObject : Option[QueueObject] = Option(someJavaObject.getResponse)

除了其他人已经展示的内容(例如在foreach上调用Option,这可能会有点混乱),您也可以在其上调用map(并忽略结果)如果您不需要它,请执行map操作):

getObject map QueueManager.add

如果OptionNone,则无效;如果是QueueManager.add则调用Some

我发现使用常规if比使用任何这些“技巧”更清晰和简单,只是为了避免缩进级别。你也可以把它写在一行:

if (getObject.isDefined) QueueManager.add(getObject.get)

或者,如果您想要处理null而不是使用Option

if (getObject != null) QueueManager.add(getObject)

编辑 - Ben是对的,如果它有副作用,请注意不要多次调用getObject;最好这样写:

val result = getObject
if (result.isDefined) QueueManager.add(result.get)

或:

val result = getObject
if (result != null) QueueManager.add(result)

答案 1 :(得分:11)

Option(getObject) foreach (QueueManager add)

答案 2 :(得分:10)

如果它返回Option[QueueObject],您可以使用getObject.foreach { QueueManager.add }之类的构造。您可以使用Option(getObject).foreach ...将其直接包装,因为Option[QueueObject](null)None

答案 3 :(得分:7)

虽然我确信@Ben Jackson的Option(getObject).foreach是首选方式,但我喜欢使用允许我写的AnyRef pimp:

getObject ifNotNull ( QueueManager.add(_) )

我发现它读得更好。

而且,以更一般的方式,我有时会写

val returnVal = getObject ifNotNull { obj =>
  returnSomethingFrom(obj)
} otherwise {
  returnSomethingElse
}

...如果我正在处理Option,则将ifNotNull替换为ifSome。我发现它比首先包装一个选项然后进行模式匹配更清晰。

(有关实施,请参阅Implementing ifTrue, ifFalse, ifSome, ifNone, etc. in Scala to avoid if(...) and simple pattern matchingOtherwise0 / Otherwise1类。)