我正在尝试编写一个接受字符串并返回过滤函数结果的函数(我正在处理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
,但没有成功。
答案 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
函数将序列转换为字符串。