如何在scala的单个语句中检查null?
Posted
技术标签:
【中文标题】如何在scala的单个语句中检查null?【英文标题】:How to check for null in a single statement in scala? 【发布时间】:2011-08-10 02:23:48 【问题描述】:在我的 scala 代码中:
QueueManager.add(getObject)
其中getObject
是一个返回QueueObject
类型对象的方法。
def getObject : QueuObject =
val response = //some response
return response
有没有一种方法可以在添加 QueueObject 时检查响应是否为空?我知道我可以做到:
if (getObject != null)
QueueManager.add(getObject)
但我不希望添加缩进级别。有没有内联的操作符?
谢谢。
【问题讨论】:
【参考方案1】:尽量避免在 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
或使用显式
return
Scala 中的声明;结果将是
块中的最后一个表达式(实际上,由于只有一条语句,因此您甚至不需要块)。
def getObject : Option[QueueObject] = Option(someJavaObject.getResponse)
除了其他人已经显示的内容(例如在Option
上调用foreach
,这可能会有点混乱),您还可以在其上调用map
(如果您忽略映射操作的结果,不需要):
getObject map QueueManager.add
如果Option
是None
,这将不起作用,如果是Some
,则调用QueueManager.add
。
我发现使用常规的if
比使用任何这些“技巧”更清晰、更简单,只是为了避免缩进级别。你也可以只写一行:
if (getObject.isDefined) QueueManager.add(getObject.get)
或者,如果您想处理null
而不是使用Option
:
if (getObject != null) QueueManager.add(getObject)
edit - Ben 是对的,如果有副作用,请注意不要多次调用getObject
;最好这样写:
val result = getObject
if (result.isDefined) QueueManager.add(result.get)
或:
val result = getObject
if (result != null) QueueManager.add(result)
【讨论】:
【参考方案2】:Option(getObject) foreach (QueueManager add)
【讨论】:
酷,我没有意识到你可以写(QueueManager add)
而不是(QueueManager add _)
。【参考方案3】:
如果它返回 Option[QueueObject]
,您可以使用类似 getObject.foreach QueueManager.add
的构造。你可以用Option(getObject).foreach ...
直接将它包裹起来,因为Option[QueueObject](null)
是None
。
【讨论】:
【参考方案4】:虽然我确信@Ben Jackson 与Option(getObject).foreach
的asnwer 是首选方式,但我喜欢使用AnyRef
允许我写作的皮条客:
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
类。)
【讨论】:
好的,但是你为什么要创建自己的if
/ else
版本(将 else
重命名为 otherwise
...)。这是一个有趣的练习,但它不会在实践中为您赢得任何东西,并且可能会使您的代码更容易被其他人阅读。
@Jesper 我总体上同意——尽管我发现getObject ifNotNull ( QueueManager.add(_) )
比Option(getObject).foreach(QueueManager.add(_))
更容易混淆。 foreach
尤其倾向于让我认为可能有几个对象正在被处理,而我总是不得不扫描回来发现它实际上是一个 Option
。如果Option
可以为这些方法提供命名良好的别名,那就太好了。
Philippe 是的,我也不喜欢foreach
的技巧,在Option
上使用时确实有点误导;最简单的就是用普通的if
编写它。以上是关于如何在scala的单个语句中检查null?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 spark scala 中检查与其关联的列名和数据是不是匹配