Programming Clojure学习笔记——使用序列统一数据

来源:互联网 发布:保定软件技术学院电话 编辑:程序博客网 时间:2024/05/17 05:09
4.4 Clojure使Java可序列化
1. 序列访问Java集合
集合可以像序列一样操作称为可序列
数组可序列
user=> (first (.getBytes "hello"))
104
Hashtable和Map也可序列
user=> (first (System/getProperties))
#<Entry java.runtime.name=Java(TM) SE Runtime Environment>

Clojure自动将集合包装成序列,但不会自动将集合还原为它们原来的类型。

2. 序列访问正则表达式
(re-seq regexp string) 将正则表达式regex应用到string上,由匹配结果生成序列,如
user=> (re-seq #"\w+" "the quick brown fox")
("the" "quick" "brown" "fox")

3. 序列访问文件系统
user=> (import '(java.io File))
java.io.File
列出当前目录下所有文件及文件夹
user=> (.listFiles (File. "."))
#<File[] [Ljava.io.File;@1b4a74b>
序列当前目录下所有文件及文件夹列表
user=> (seq (.listFiles (File. ".")))
(#<File .\.gitignore> #<File .\bin> #<File .\book> #<File .\classes> #<File .\cm> #<File .\examples> #<File .\lancet> #<File .\lib> #<File .\LICENSE> #<File .output> #<File .\public> #<File .\Rakefile> #<File .\reader> #<File .\snippets>
#<File .\test> #<File .\user.clj>)

Clojure提供一种深度优先遍历目录树的方法file-seq,
user=> (count (file-seq (File. ".")))
193
输出当前目录下所有文件及文件夹个数

4. 序列访问流
可以使用line-seq序列任何Java Reader的行
user=> (use '[clojure.contrib.duck-streams :only (reader)])
user=> (with-open [rdr (reader "../code/user.clj")] (count (line-seq rdr)))
2
计算文件code/user.clj的行数

5. 序列访问XML
函数clojure.xml.parse解析Xml文件,流或URI,以Clojure Map形式返回XML数据树
(for [x (xml-seq
  (parse (java.io.File. "examples/sequences/compositions.xml")))
    :when (= :composition (:tag x))]
   (:composer (:attrs x)))
以上代码从compositions.xml中抽取出composer
原创粉丝点击