2011年6月20日

Groovy 的 inject() method 應用

很多時候撰寫 Java 程式處理多筆資料,大多會以 Map 的型式在呈現。應用 iteration 的技巧將 DO 轉為 TO,不外乎使用 for / while loop。

而在 Groovy 的領域,則可以使用 inject() method; HA.KI blog 中先展現了 inject() 在數值加總的應用外,又示範將 List 物件轉為 Map 的技巧:
def persons = [
    new Person(username:'mrhaki', email: 'email@host.com'),
    new Person(username:'hubert', email: 'other@host.com')
]

def map = persons.inject([:]) { result, person ->
    result[person.username] = person.email
    /*return*/ result
}
在 result 的增設上, 可以使用下列的技巧:
    result << [(person.username): person.email]

    result += [(person.username): person.email]
如此, 連最後一行的 result return 都可以省了:
def map = persons.inject([:]) { result, person ->
    result << [(person.username): person.email]
}

2011年6月1日

Grails 編譯時的中文編碼問題

暨上篇 UnsupportedClassVersionError 問題之後; 另外在程式中的中文編碼部份, 以過去常用的方法來進行編譯:


不過呢, 在 Grails v1.3.7 版本中沒有發生作用。但研究後發現了 ${GRAILS_HOME}/scripts/_GrailsClasspath.groovy
...
compConfig.sourceEncoding = "UTF-8"
...
將它改為 Big5 後去測試 ~~~ 一樣沒有作用。於是我就
>grep 'encoding' *.groovy
發現原來編碼早已固定為 UTF-8 了。所以呢, 就想到了去變更 ${GRAILS_HOME}/scripts/
_GrailsCompile.groovy 與 _GrailsPackage.groovy :
ant.groovyc(
    ...,
    encoding: System.getProperty("file.encoding","UTF-8"),
    ...)

javac(
    ...,
    encoding: System.getProperty("file.encoding","UTF-8"),
    ...)
這樣子, 生活又變得美好了。