Is there an equivalent for Java's switch construct in Clojure? If yes, what is it? If no, do we have to use if else ladder to achieve it?
case is a good option as pointed out by Jan
cond is also very useful in many related circumstances, particularly if you want to switch on the basis of evaluating a range of different conditional expressions, e.g.
(defn account-message [balance]
  (cond 
    (< balance 0) "Overdrawn!"
    (< balance 100) "Low balance"
    (> balance 1000000) "Rich as creosote"
    :else "Good balance"))
Note that the result of cond is determined by the first matching expression, so a negative balance will display "Overdrawn!" even though it also matches the low balance case.
[I have edited the code - removed the extra bracket at the end to make it work]
Try the case macro:
(case (+ 2 3)
  6 "error"
  5 "ok")
or with default value
(case (+ 2 3)
  5 "ok"
  "error")
Remember that according to the documentation
The test-constants are not evaluated. They must be compile-time literals, and need not be quoted. (...)
See more examples at ClojureDocs.
Though @Jan and @mikera suggestions to use case or cond (may I add condp to the list?) are sound from a functional¹ standpoint and though case 's limitations (e.g. test values can only be compile-time constants ; a default return value is mandatory) mirror those of switch there are some subtle differences:
case cannot be used with Java Enum constants ;
case 's dispatch is based on hashing AFAIK which makes it comparable to hashmaps in terms of performance ;  switch is way faster ;
you cannot fall-through with case, which means that you must use other options (condp with value sets ?) to mirror switch 's behaviour.
[¹] not functional as in functional-programming, functional as in fulfilling a function, serving a purpose.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With