2012-06-12 3 views
12

У меня есть следующий метод, где я хочу, чтобы проверить event.status свойство только если status был принят в:Test только если переменная не является нулевым, если оператор

def findEvent(String desc, String status = null, Collection events) { 
     return events.find { 
      it.description == desc && \\If status is not null: it.status == status 
     } 

     throw new Exception("Review Event Record Not Found: ${desc}") 
} 

Я думал, что это может быть сделано, как это, но он не работает:

def findEvent(String desc, String status = null, Collection events) { 
     return events.find { 
      it.description == desc && (status != null ?: {it.status == status}) 
     } 

     throw new Exception("Review Event Record Not Found: ${desc}") 
} 

Можно ли это сделать? Или мне нужно вернуться к чему-то вроде этого:

if (status != null) { 
    return events.find { 
     it.description == desc && it.status == status 
    } 
} else if (status == null) { 
    return events.find { 
     it.description == desc 
    } 
} 

Есть ли какая-то передовая практика?

ответ

21

Я не верю, что выражение является чувственным, как оно есть.

Элвис означает «если правдивый, используйте значение, иначе используйте эту другую вещь».

Ваша «другая вещь» - это закрытие, а значение - status != null, ни одно из которых не похоже на то, что вы хотите. Если statusявляется null, Elvis говорит true. Если это не так, вы получите дополнительный слой закрытия.

Почему вы не можете просто использовать:

(it.description == desc) && ((status == null) || (it.status == status)) 

Даже если не работы, все, что вам нужно, это замыкание, чтобы вернуть соответствующее значение, не так ли? Нет необходимости создавать два отдельных вызова find, просто используйте промежуточную переменную.

+0

(it.description == desc) && ((status == null) || (it.status == status)) выглядит идеально. Я подтверждаю, что это работает, когда я получаю шанс. По общему признанию, это первый случай, когда я когда-либо встречался с оператором Элвиса, поэтому я играл в темноте. Привет, Дэйв –

Смежные вопросы