尽量避免在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
(如果你不忽略了地图操作的结果吨需要它):
getObject map QueueManager.add
这将做什么,如果Option
是None
,并调用QueueManager.add
如果它是一个Some
。
我发现使用常规的if
比使用任何这些“技巧”只是为了避免缩进级别更清晰和简单。你也可以只写在一行:
if (getObject.isDefined) QueueManager.add(getObject.get)
,或者,如果你想处理null
而不是使用Option
:
if (getObject != null) QueueManager.add(getObject)
编辑 - 本是正确的,要小心不要如果它有副作用,请多次呼叫getObject
;更好写这样的:
val result = getObject
if (result.isDefined) QueueManager.add(result.get)
或:
val result = getObject
if (result != null) QueueManager.add(result)
好,但为什么你想使自己的'if' /'else'(重命名'else'到版本'otherwise' ...)。这是一个有趣的练习,但它在练习中并不会赢得任何东西,并可能会让您的代码更容易让其他人阅读。 – Jesper 2011-04-21 09:16:22
@Jesper我一般同意 - 尽管我发现'getObject ifNotNull(QueueManager.add(_))'比'Option(getObject).foreach(QueueManager.add(_))'更容易混淆。 'foreach'尤其会让我觉得可能有几个对象正在被处理,我总是必须回头看看它是否是一个'Option'。如果'Option'可以为这些方法命名的别名会很好。 – 2011-04-21 10:23:58
Philippe是的,我不喜欢'foreach'这个技巧,在'Option'上使用的确有点误导。最简单的就是用普通的'if'来写。 – Jesper 2011-04-21 22:09:31