2009-11-06 86 views
46

比方說,我有java.lang.Character中如何將Clojure中的字符LazySeq轉換爲字符串?

(\b \ \! \/ \b \ \% \1 \9 \/ \. \i \% \$ \i \space \^@) 

LazySeq我怎樣才能將它轉換爲字符串?我已經嘗試了明顯

(String. my-char-seq) 

但它拋出

java.lang.IllegalArgumentException: No matching ctor found for class java.lang.String (NO_SOURCE_FILE:0) 
[Thrown class clojure.lang.Compiler$CompilerException] 

我想是因爲String構造需要一個原始的char []代替LazySeq。所以然後我嘗試了類似

(String. (into-array my-char-seq)) 

但它引發相同的異常。現在的問題是,插入數組返回一個java.lang.Character []而不是原型char []。這是令人沮喪的,因爲我居然產生這樣

(map #(char (Integer. %)) seq-of-ascii-ints) 

我的字符序列基本上我有代表ASCII字符INTS的序列; 65 = A等你可以看到我明確地使用原始類型強制功能(char x)

這意味着,我的地圖函數返回一個原始焦炭但Clojure的地圖功能總體上返回java.lang.Character中對象。

回答

97

這工作:

(apply str my-char-seq) 

基本上,STR調用它的每一個參數的個數的toString(),然後連接它們。這裏我們使用apply將序列中的字符作爲參數傳遞給str

10

的另一種方法是使用clojure.string/join,如下所示:

(require '[clojure.string :as str]) 
(assert (= (vec "abcd")    [\a \b \c \d])) 
(assert (= (str/join (vec "abcd")) "abcd")) 
(assert (= (apply str (vec "abcd")) "abcd")) 

有它接受一個分離器的clojure.string/join替換形式。請參閱:

http://clojuredocs.org/clojure_core/clojure.string/join

對於更復雜的問題,您也不妨注視strcatfrom the Tupelo library

(require '[tupelo.core :as t]) 
(prn (t/strcat "I " [ \h \a nil \v [\e \space (byte-array [97]) 
        [ nil 32 "complicated" (Math/pow 2 5) '("str" nil "ing") ]]])) 
;=> "I have a complicated string" 
3

作爲一個特殊的情況下,如果基礎類型有問題的順序是clojure.lang.StringSeq可以也可以這樣做:

(.s (my-seq)) 

這是非常高效的,因爲它只是拉o從clojure StringSeq類中獲取公共的最終CharSequence字段。

實施例:

(type (seq "foo")) 
=> clojure.lang.StringSeq 

(.s (seq "foo")) 
=> "foo" 

(type (.s (seq "foo"))) 
=> java.lang.String 

的定時的影響的例子(使用A型提示時,注意的差異):

(time 
    (let [q (seq "xxxxxxxxxxxxxxxxxxxx")] 
    (dotimes [_ 1000000] 
     (apply str q)))) 
"Elapsed time: 620.943971 msecs" 
=> nil 

(time 
    (let [q (seq "xxxxxxxxxxxxxxxxxxxx")] 
    (dotimes [_ 1000000] 
     (.s q)))) 
"Elapsed time: 1232.119319 msecs" 
=> nil 

(time 
    (let [^StringSeq q (seq "xxxxxxxxxxxxxxxxxxxx")] 
    (dotimes [_ 1000000] 
     (.s q)))) 
"Elapsed time: 3.339613 msecs" 
=> nil