Подтвердить что ты не робот

Как проверить значение null в одном выражении в scala?

В моем scala коде:

QueueManager.add(getObject)

где getObject - метод, возвращающий объект типа QueueObject.

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

Есть ли способ проверить, что ответ имеет значение null, при добавлении QueueObject? Я знаю, что могу это сделать:

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

Но я не хочу добавлять уровень отступов. Есть ли оператор, который делает это inline?

Спасибо.

4b9b3361

Ответ 1

Старайтесь избегать использования null в Scala. Это действительно там только для взаимодействия с Java. В Scala используйте Option для вещей, которые могут быть пустыми. Если вы вызываете метод Java API, который может возвращать null, немедленно оберните его в 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)

Кроме того, что уже показали другие (например, вызов 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)

edit - Бен прав, будьте осторожны, чтобы не называть getObject более одного раза, если у него есть побочные эффекты; лучше напишите так:

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

или

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

Ответ 2

Если вместо него возвращен Option[QueueObject], вы можете использовать конструкцию типа getObject.foreach { QueueManager.add }. Вы можете заключить его прямо в строку с помощью Option(getObject).foreach ..., потому что Option[QueueObject](null) - None.

Ответ 3

Option(getObject) foreach (QueueManager add)

Ответ 4

Хотя я уверен, что @Ben Jackson asnwer с Option(getObject).foreach - это предпочтительный способ сделать это, мне нравится использовать сутенер AnyRef, который позволяет мне писать:

getObject ifNotNull ( QueueManager.add(_) )

Я считаю, что это читается лучше.

И, более общим способом, я иногда пишу

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

... заменить ifNotNull на ifSome, если я имею дело с Option. Я нахожу это более ясным, чем первая упаковка в опции, а затем сопоставление с шаблоном.

(Для реализации см. Внедрение ifTrue, ifFalse, ifSome, ifNone и т.д. в Scala, чтобы избежать (...) и простого сопоставления шаблонов и классы Otherwise0/Otherwise1.)