Clojure join无法根据筛选函数的结果创建字符串

Clojure join无法根据筛选函数的结果创建字符串,clojure,Clojure,我正在尝试编写一个函数,它接受一个字符串并返回一个筛选函数的结果(我正在解决问题)。结果也必须是字符串 我写了这样一篇文章: (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.

我正在尝试编写一个函数,它接受一个字符串并返回一个筛选函数的结果(我正在解决问题)。结果也必须是字符串

我写了这样一篇文章:

(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
,但没有成功。

试试这个:

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

filter
函数返回一个延迟序列。如果要获取
字符串
,应通过应用
str
函数将序列转换为字符串。

必须通过应用
str
函数将
过滤器
返回的惰性序列转换为字符串。另外,使用
defn
定义一个新函数-如下所示:

(defn my-caps [s]
  (apply str (filter #(Character/isUpperCase %) s)))
它按预期工作:

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

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

谢谢!它让我查找双箭头线程宏。我以前不知道线程宏。@ntalbs,为什么在这里使用
->
操作符?一个简单的函数调用就足以调用
apply
@ÓscarLópez是的,你是对的。结果是一样的。但是,使用
->
可以更轻松地阅读代码,并在我的思维过程中输入代码。就这样。这是一种个人喜好,你说得对。到目前为止,我一直在将文件重新加载到REPL,但只有在我真正重新启动它之后,它才起作用。线程并不是一种浪费——我从集合中学习了创建字符串的新方法。