1.Groovy 中的閉包
Groovy 已經將迭代轉變為任何集合的直接成員。在這個示例中,不必獲取
Iterator 實例并直接操縱它,可以直接在集合上迭代。而且,通常放在循環構造內的行為(例如
for 循環體中
println)接下來要放在閉包內。在深入之前,先看看如何執行這步操作。
def acoll =
["Groovy", "Java", "Ruby"]
acoll.each{
println it
}
請注意,each
直接在
acoll 實例內調用,而
acoll 實例的類型是
ArrayList。在
each 調用之后,引入了一種新的語法
— {,然后是一些代碼,然后是
}。由
{} 包圍起來的代碼塊就是閉包。
迭代無處不在
閉包在
Groovy 中頻繁出現,但是,通常用于在一系列值上迭代的時候。請記住,一系列值可以用多種方式表示,不僅可以用列表表示—例如,可以在映射、String、JDBC
Rowset、File 的行上迭代,等等。
請記住,凡是集合或一系列的內容,都可以使用下面這樣的代碼進行迭代。
"ITERATION".each{
println it.toLowerCase()
}
2.Groovy中的?(代表判斷條件)
Groovy 通過
? 操作符提供了一個安全網—在方法調用前面添加一個
? 就相當于在調用前面放了一個條件,可以防止在
null 對象上調用方法。
例如,將
sng2.artist.toUpperCase()
行替換成
sng2.artist?.toUpperCase()。請注意,也可以省略后面的括號。(Groovy
實際上也允許在不帶參數的方法上省略括號。不過,如果
Groovy 認為您要訪問類的屬性而不是方法,那么這樣做可能會造成問題。)
?
操作符時刻都非常有用,可以極大地減少條件語句。
3.集合
將對象組織到像列表和映射這樣的數據結構中是一項基本的編碼任務,是我們大多數人每天要做的工作。像大多數語言一樣,Groovy
定義了一個豐富的庫以管理這些類型的集合。如果曾經涉足
Python 或者 Ruby,那么應該熟悉
Groovy 的集合語法。
使用 Groovy 集合
aCollect = [5, 9, 2, 2, 4, 5, 6]
println aCollect.join(' - ') // prints 5 - 9 - 2 - 2 - 4 - 5 - 6
println aCollect.count(2)
// prints 2
println aCollect.sort()
// prints [2, 2, 4, 5, 5, 6, 9]
|
4.輕松的 IO
Groovy IO 操作很輕松,特別是與迭代器和閉包結合時。Groovy 使用標準 Java 對象如 File 、 Reader 和 Writer ,并用接收閉包作參數的額外方法增強了它們。如在清單 24 中,可以看到傳統的 java.io.File ,但是帶有額外的、方便的 eachLine 方法。
Groovy IO
import java.io.File
new File("File-IO-Example.txt").eachLine{
line |
println
"read the following line -> " + line
}
|
因為文件實質上是一系列行、字符等,所以可以相當簡單地迭代它們。 eachLine 方法接收一個閉包并迭代文件的每一行,在這里是 File-IO-Example.txt 。以這種方式使用閉包是相當強大的,因為 Groovy 保證所有文件資源都是關閉的,不考慮任何異常。這意味著無需大量 try / catch / finally 子句就可以進行文件 IO!
5.
Groovy進行JDBC編程
Groovy 的 SQL 魔力在于一個叫做 GroovySql 的精致的 API。使用閉包和迭代器, GroovySql 干凈漂亮地把 JDBC 的資源管理職責從開發人員轉移到 Groovy 框架。這么做之后,就消除了JDBC 編程的繁瑣,從而使您可以把注意力放在查詢和查詢結果上。
執行簡單的查詢
packagecom.groovy
import groovy.sql.Sql
publicclass JDBCGroovy{
publicstaticvoid main(def args){
def sql = Sql.newInstance("jdbc:mysql://localhost:3306/oa","root","122547",
"com.mysql.jdbc.Driver")
sql.eachRow("select * from t_user"){user ->
println user.username + ":" +
user.password
}
}
}
|
執行復雜的查詢
前面的例子相當簡單,但是 GroovySql 在處理更復雜的數據操縱查詢(例如 insert、 update 和 delete 查詢)時,也是非常可靠的。對于這些查詢,您沒有必要用迭代器,所以 Groovy 的 Sql 對象另外提供了 execute 和 executeUpdate 方法。這些方法讓人想起普通的 JDBC
statement 類,它也有 execute 和 executeUpdate 方法。
在清單 6 中,您看到一個簡單的 insert,它再次以 ${} 語法使用變量替換。這個代碼只是向 word 表插入一個新行。
清單 6. 用 GroovySql 進行插入
wid = 999
spelling
= "Nefarious"
pospeech
= "Adjective"
sql.execute("insert into word (word_id,
spelling, part_of_speech)
values
(${wid}, ${spelling}, ${pospeech})")
Groovy 還提供 execute
方法的一個重載版本,它接收一列值,這些值與查詢中發現的 ? 元素對應。在清單 7 中,我簡單地查詢了 word 表中的某個行。在底層,GroovySql 創建了普通 Java 語言 java.sql.PreparedStatement 的一個實
例。
清單 7. 用 GroovySql 創建 PreparedStatement 的實例
val = sql.execute("select * from word where word_id = ?",
[5])
更新的方式基本相同,也使用 executeUpdate 方法。還請注意,在清單 8 中 executeUpdate 方法接收一列值,與查詢中的 ? 元素對應。
清單 8. 用 GroovySql 進行更新
nid = 5
spelling = "Nefarious"
sql.executeUpdate("update word
set word_id = ? where spelling = ?", [nid, spelling])
刪除實際上與插入相同,當然,語法不同,如清單 9 所示。
清單 9. 用 GroovySql 進行刪除
sql.execute("delete from word
where word_id = ?" , [5])
簡化數據操縱
任何想簡化 JDBC 編程的 API 或工具最好有一些好的數據操縱特性
數據集(DataSet)
構建于 GroovySql 簡單性的基礎之上,GroovySql 支持 DataSet 類型的概念,這基本上是數據庫表的對象表示。使用 DataSet,您可以在行中遍歷,也可以添加新行。實際上,用數據集是方便地表示表格的公共數據集合的方式。
但是,目前 GroovySql DataSet 類型的不足之處是它們沒有代表關系;它們只是與數據庫表的一對一映射。在清單 10 中,我創建了一個來自 word 表的 DataSet。
清單 10. 用 GroovySql 創建數據集
import groovy.sql.Sql
class GroovyDatasetsExample1{
static void main(args) {
sql=Sql.newInstance("jdbc:mysql://localhost:3306/words",
"words","words", "org.gjt.mm.mysql.Driver")
words = sql.dataSet("word")
words.each{ word |
println word.word_id + " " + word.spelling
}
words.add(word_id:"9999",spelling:"clerisy",part_of_speech:"Noun")
}
}
posted on 2009-11-30 16:55
唯美古典 閱讀(1662)
評論(0) 編輯 收藏 所屬分類:
Groovy