Let's say I have a LazySeq of java.lang.Character like
(\b \ \! \/ \b \ \% \1 \9 \/ \. \i \% \$ \i \space \^@)
How can I convert this to a String? I've tried the obvious
(String. my-char-seq)
but it throws
java.lang.IllegalArgumentException: No matching ctor found for class java.lang.String (NO_SOURCE_FILE:0)
[Thrown class clojure.lang.Compiler$CompilerException]
I think because the String constructor expects a primitive char[] instead of a LazySeq. So then I tried something like
(String. (into-array my-char-seq))
but it throws the same exception. The problem now is that into-array is returning a java.lang.Character[] instead of a primitive char[]. This is frustrating, because I actually generate my character sequence like this
(map #(char (Integer. %)) seq-of-ascii-ints)
Basically I have a seq of ints representing ASCII characters; 65 = A, etc. You can see I explicitly use the primitive type coercion function (char x).
What this means is that my map function is returning a primitive char but the Clojure map function overall is returning the java.lang.Character object.
This works:
(apply str my-char-seq)
Basically, str calls toString() on each of its args and then concatenates them. Here we are using apply to pass the characters in the sequence as args to str.