Clojure join无法根据filter函数的结果创建一个字符串

时间:2013-06-23 22:12:35

标签: clojure

我正在尝试编写一个接受字符串并返回过滤函数结果的函数(我正在处理4clojure个问题)。结果也必须是字符串。

我写过:

(fn my-caps [s]
  (filter #(Character/isUpperCase %) s))

(my-caps "HeLlO, WoRlD!")

Result: (\H \L \O \W \R \D)

现在我正在尝试使用clojure.string / join从这个列表中创建一个字符串,如下所示:

(fn my-caps [s]
  (clojure.string/join (filter #(Character/isUpperCase %) s)))

然而结果是一样的。我也尝试使用apply str,但没有成功。

3 个答案:

答案 0 :(得分:4)

您必须通过应用filter函数将str返回的延迟序列转换为字符串。另外,使用defn定义一个新函数 - 这是如何:

(defn my-caps [s]
  (apply str (filter #(Character/isUpperCase %) s)))

按预期工作:

(my-caps "HeLlO, WoRlD!")
=> "HLOWRD"

答案 1 :(得分:4)

您粘贴的最后一个代码段工作正常。 join确实会返回一个字符串。

答案 2 :(得分:3)

试试这个:

(defn my-caps [s]
  (->> (filter #(Character/isUpperCase %) s)
       (apply str)))

filter函数返回一个惰性序列。如果您想获得string,则应通过应用str函数将序列转换为字符串。