2012-06-12 12 views
12

Ich habe die folgende Methode, wo ich nur die event.status Eigenschaft testen will, ob status hat bestanden:-Test nur, wenn die Variable nicht null ist, wenn Anweisung

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

Ich dachte, es wie dies geschehen könnte, aber es scheint nicht zu funktionieren:

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

Gibt es eine Möglichkeit, dies zu tun? Oder muss ich zurück zu etwas wie diesem gehen:

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

Gibt es eine Art von Best Practice?

Antwort

21

Ich glaube nicht, dass der Ausdruck so sensibel ist wie es ist.

Elvis bedeutet "wenn truthy, verwenden Sie den Wert, sonst verwenden Sie diese andere Sache."

Ihre "andere Sache" ist eine Schließung, und der Wert ist status != null, von denen keiner scheint, was Sie wollen. Wenn status null ist, sagt Elvis true. Ist dies nicht der Fall, erhalten Sie eine zusätzliche Verschlussschicht.

Warum können Sie nicht nur verwenden:

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

Auch wenn die tat nicht Arbeit, alles, was Sie brauchen, ist die Schließung des entsprechenden Wert zurück, nicht wahr? Es ist nicht notwendig, zwei separate find Aufrufe zu erstellen, verwenden Sie einfach eine Zwischenvariable.

+0

(it.description == desc) && ((status == null) || (it.status == status)) sieht perfekt aus. Ich bestätige, dass es funktioniert, wenn ich eine Chance bekomme. Zugegeben, das war das erste Mal, dass ich den Elvis-Operator getroffen habe, also spielte ich irgendwie im Dunkeln. Prost, Dave –

Verwandte Themen