首先,我是一名Clojure初学者,因为我的英语不好而感到厌烦。
假设您有一个函数被假定为返回包含各种信息的地图列表(在此示例中为系统信息)。
我已经提出了以下示例,但它似乎是错误的并且过于复杂。
我的问题是'对于[disk(File / listRoots)'已经返回一个列表,我必须合并2个列表才能获得所需的输出,为此必须存在更好的解决方案。
我希望你们中的某些人能够以更加'Clojure'的方式告诉我如何做到这一点。
(import
[java.lang Runtime System]
[java.io File])
(defn get-sysinfo []
(let [basic-info (list
{:name "Processor Count:", :value (. (Runtime/getRuntime) availableProcessors)}
{:name "OS Name:", :value (System/getProperty "os.name")}
{:name "OS Arch:", :value (System/getProperty "os.arch")}
{:name "User Name:", :value (System/getProperty "user.name")}
{:name "Java Version:", :value (System/getProperty "java.version")})]
(concat basic-info (for [disk (File/listRoots)]
{:name (str "Disk " (. disk getAbsolutePath)), :value (str "Free Space " (float (/ (. disk getFreeSpace) (* 1024 1024 1024))) " GB")}))))
提前致谢
马库斯
答案 0 :(得分:1)
由于您正在使用(for ...)转换每个元素,因此map似乎更合乎逻辑。你不能真正避免合并两个列表,因为一个是“固定的”而另一个是后来从文件列表中生成的。
使用(.methodName对象)而不是(.object methodName)也更惯用 - 尽管这纯粹是一种风格问题。
我会这样做:
(defn get-sysinfo []
(concat (list
{:name "Processor Count:", :value (. (Runtime/getRuntime) availableProcessors)}
{:name "OS Name:", :value (System/getProperty "os.name")}
{:name "OS Arch:", :value (System/getProperty "os.arch")}
{:name "User Name:", :value (System/getProperty "user.name")}
{:name "Java Version:", :value (System/getProperty "java.version")})
(map #(hash-map :name (str "Disk " (.getAbsolutePath %)),
:value (str "Free Space "
(float (/ (.getFreeSpace %) (* 1024 1024 1024)))
" GB"))
(File/listRoots))))
答案 1 :(得分:1)
您还可以使用小list*
助手。它根据给定元素创建一个列表。最后一个作为尾部列表。所以“合并”是隐含的。
(defn get-sysinfo
[]
(list*
{:name "Processor Count:" :value (.availableProcessors (Runtime/getRuntime))}
{:name "OS Name:", :value (System/getProperty "os.name")}
{:name "OS Arch:", :value (System/getProperty "os.arch")}
{:name "User Name:", :value (System/getProperty "user.name")}
{:name "Java Version:", :value (System/getProperty "java.version")}
(for [disk (File/listRoots)]
{:name (str "Disk " (.getAbsolutePath disk))
:value (str "Free Space " (float (/ (.getFreeSpace disk)
(* 1024 1024 1024)))
" GB")})))
但是,也许你真的想要回一张地图?
(defn get-sysinfo-map
[]
(into {"Processor Count" (.availableProcessors (Runtime/getRuntime))
"OS Name" (System/getProperty "os.name")
"OS Arch" (System/getProperty "os.arch")
"User Name" (System/getProperty "user.name")
"Java Version" (System/getProperty "java.version")}
(for [disk (File/listRoots)]
[(str "Disk " (.getAbsolutePath disk))
(float (/ (.getFreeSpace disk) (* 1024 1024 1024)))])))