I have a java class in clojure, which comes from a method that returns classes. I want to case switch on these, like so:
(case type
java.lang.String (println "Found String" name)
java.lang.Long (println "Found Long" name)
java.nio.ByteBuffer (println "Found ByteBuffer" name)
java.lang.Boolean (println "Found Boolean" name)
java.math.BigDecimal (println "Found BigDecimal" name)
java.lang.Double (println "Found Double" name)
java.lang.Float (println "Found Float" name)
java.net.InetAddress (println "Found InetAddress" name)
java.lang.Integer (println "Found Integer" name)
java.util.Date (println "Found Date" name)
java.util.UUID (println "Found UUID" name)
java.math.BigInteger (println "Found BigInteger" name)
java.util.List (println "Found List" name)
java.util.Set (println "Found Set" name)
java.util.Map (println "Found Map" name))
But when I run this I get
java.lang.IllegalArgumentException: No matching clause: class java.util.UUID
Which is what is thrown when no matching case is found. How do I match the class in the case clause?
You can't really do any better than what cheshire does, which is basically repeated calls to instance?, like this:
(condp instance? x
String :string
Integer :int
:unknown)
If you don't want to pay attention to subtyping, and use only an exact match on x's type, you can use (condp = (class x) ...) instead.
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