【问题标题】:Clojure join fails to create a string from the result of filter functionClojure 连接无法从过滤器函数的结果创建字符串
【发布时间】:2013-06-23 22:12:34
【问题描述】:

我正在尝试编写一个函数,它接受一个字符串并返回一个过滤函数的结果(我正在解决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,但没有成功。

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

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

    它按预期工作:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你是对的。到目前为止,我一直在将文件重新加载到 REPL,但只有在我真正重新启动它之后它才起作用。不过,线程并没有浪费——我已经学会了从集合中创建字符串的新方法。
      【解决方案3】:

      试试这个:

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

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

      【讨论】:

      • 谢谢!它让我查找了双箭头线程宏。我以前不知道线程宏。
      • @ntalbs,为什么在这里使用->> 运算符?一个简单的函数调用就足以调用apply
      • @ÓscarLópez 是的,你是对的。结果是一样的。但是,使用->> 可以更轻松地阅读代码阅读和打字,就像我的思考过程一样。就是这样。这是一种个人喜好。
      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2014-12-03
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多