如何在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

如果OptionNone,这将不起作用,如果是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?的主要内容,如果未能解决你的问题,请参考以下文章

如何在显示列之前检查 SELECT 语句是不是存在

如何在scala中自动重新运行sbt项目

如何在scala中检查用户输入类型(数据类型)?

如何在 spark scala 中检查与其关联的列名和数据是不是匹配

如何使用 Scala 进行 instanceof 检查(测试)

从 SQL 函数获取单个值时,如何将 NULL 更改为 0?