Clojure REPL,互操作,无法解析符号

Ber*_*erg 3 java clojure clojure-java-interop

假设files是 Clojure 中的 Java 列表File,我想获取文件名列表。在 Leiningen REPL 中我可以使用,比如说,

(.getName (nth files 4))
=> "image.jpg"
Run Code Online (Sandbox Code Playgroud)

但如果我用

(map .getName files)
Run Code Online (Sandbox Code Playgroud)

REPL 抛出一个CompilerException java.lang.RuntimeException: Unable to resolve symbol: .getName in this context. 这是为什么?

我可以解决这个问题

(defn gn [file] (.getName file))
(map gn files)
Run Code Online (Sandbox Code Playgroud)

但我现在想知道是否有一种更优雅的方法将 Java 方法映射到 Clojure 中的列表。

Shl*_*omi 5

您可以使用memfn(有些人说您不应该使用,不记得为什么,欢迎评论)或简单地使用 lambda:

(map (memfn getName) files)   ;;#1
(map #(.getName %) files)     ;;#2
Run Code Online (Sandbox Code Playgroud)

至于为什么,因为这些是方法而不是函数。

  • 快速搜索了 Google 群组,这就是 Rich Hickey 本人的:['memfn 位于 #() 之前,后者现在是首选'](https://groups.google.com/d/msg/clojure /XX-zt7LYzUI/kUQDg1DDNOsJ)。 (2认同)