Как проверить на ноль в одном выражении в Scala? - PullRequest
41 голосов
/ 21 апреля 2011

В моем коде скала:

QueueManager.add(getObject)

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

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

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

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

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

Спасибо.

Ответы [ 4 ]

70 голосов
/ 22 апреля 2011

Старайтесь избегать использования 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 для него (и проигнорировать результат операции 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)
12 голосов
/ 21 апреля 2011
Option(getObject) foreach (QueueManager add)
11 голосов
/ 21 апреля 2011

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

7 голосов
/ 21 апреля 2011

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

getObject ifNotNull ( QueueManager.add(_) )

Я нахожуэто читается лучше.

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

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

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

(О реализации см. Реализация ifTrue, ifFalse, ifSome, ifNone и т. Д. Во избежание if (...) и простое сопоставление с образцом и классы Otherwise0 / Otherwise1.)

...