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.
We can convert a char to a string object in java by using the Character. toString() method.
In Clojure, strings are text between a pair of " (double quote) characters. The ' (single quote) isn't used to express strings in Clojure. When we want to use double quotes within a string, they must be escaped by \ (backslash).
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.
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