2012-06-12 7 views
12

ho il seguente metodo dove voglio testare la proprietà event.status solo se status è stato passato in:di prova solo se la variabile non è nullo in if

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}") 
} 

ho pensato che potrebbe essere fatto in questo modo, ma non sembra funzionare:

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}") 
} 

C'è un modo in cui questo potrebbe essere fatto? O devo tornare a qualcosa di simile:

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

Esiste qualche tipo di best practice?

risposta

21

Non credo che l'espressione sia sensata così com'è.

Elvis significa "se è vero, usa il valore, altrimenti usa quest'altra cosa".

La tua "altra cosa" è una chiusura e il valore è status != null, nessuno dei quali sembrerebbe essere quello che desideri. Se statusè null, Elvis dice true. Se non lo è, ottieni un ulteriore livello di chiusura.

Perché non puoi semplicemente usare:

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

Anche se quel invece no lavoro, tutto ciò che serve è la chiusura di restituire il valore appropriato, giusto? Non è necessario creare due chiamate separate find, basta utilizzare una variabile intermedia.

+0

(it.description == desc) && ((stato == null) || (it.status == stato)) sembra perfetto. Confermo che funziona quando ho una possibilità. Certamente, questa è la prima volta che ho incontrato l'operatore Elvis, quindi stavo giocando al buio. Saluti, Dave –

Problemi correlati