在我的scala代码中:
QueueManager.add(getObject)
其中getObject
是返回类型为QueueObject
的对象的方法。
def getObject : QueuObject = {
val response = //some response
return response
}
有没有办法在添加QueueObject的同时检查响应为null?我知道我可以这样做:
if (getObject != null)
QueueManager.add(getObject)
但我不想添加一定程度的缩进。是否有一个内联运算符?
感谢。
答案 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
如果Option
是None
,则无效;如果是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 matching和Otherwise0
/ Otherwise1
类。)