groovy:candy for java developers
DESCRIPTION
TRANSCRIPT
Groovy: Candy for Java Developers
by @foxgem
Why Groovy ? 看几个例子先!
让人印象深刻的 Groovy 代码• File I/O– 获取文件内容
new File("d:/grails_opts.txt").text
让人印象深刻的 Groovy 代码• File I/O– 给文件加行号
def i = 1new File("d:/grails_opts.txt").eachLine{ println "${i++}: $it"}
让人印象深刻的 Groovy 代码• File I/O– 遍历下一级子目录
new File("d:/").eachDir { println it }
让人印象深刻的 Groovy 代码• File I/O– 递归遍历子目录所有中文件
new File("d:/").eachFileRecurse { println it.name}
让人印象深刻的 Groovy 代码• 集合操作– 列表每个值乘 2 并打印
[1,2,3].each{ println it*2 }
让人印象深刻的 Groovy 代码• 集合操作– 返回新集合,其中每个元素是旧集合对应位置
元素值的 3 倍
[1,2,3].collect{ it*3 }
让人印象深刻的 Groovy 代码• 集合操作– 求和
[1,2,3].sum()
让人印象深刻的 Groovy 代码• 集合操作– 列表中是否含有偶数
[1,2,3].any{ it%2 == 0 }
让人印象深刻的 Groovy 代码• XML 解析
def xml = """ <languages> <language name="C++"> <author>Stroustrup</author> </language> <language name="Java"> <author>Gosling</author> </language></languages>"""
def languages = new XmlParser().parseText(xml)languages.each { println "${it.@name} authored by ${it.author[0].text()}"}
让人印象深刻的 Groovy 代码• 正则表达式– 列出 D:\ 下所有 txt 文件
new File("d:/").eachFileMatch(~/.*txt/){ println it.name}
让人印象深刻的 Groovy 代码• 正则表达式– 返回 html 中 <title> 的值
def titleMatcher = content =~ /<title>(.*)<\/title>/return titleMatcher[0][1]
Why Goovy ?• 简洁,兼容 Java– 90% 以上的 Java 代码可以原封不动的在
groovy 环境下运行– 自动 import 常用的包:• java.lang 、 java.util 、 java.io 、 java.net• groovy.lang 、 groovy.util
Why Goovy ?• 更多简洁代码的示例– System.out.println => println– 可选的 return– GString: "${i++}: $it"– GroovyBean (左)让 JavaBean (右)更简
洁class MyBean{ int a}
class MyBean{ private int a public int getA(){ return a} public void setA(int a){this.a = a}}
Why Goovy ?• 更好用的集合– 优化定义:
• List : [1, 3, 4, 1, 8, 9, 2, 6]• Map : ['C++' : 'Stroustrup' , 'Java' : 'Gosling' ,
'Lisp' : 'McCarthy' ]
– [] 操作符,索引类型可以是:• 正、负、区间、键。
– 大量方便的方法:• each 、 reverseEach 、 eachWithIndex 、 collect
、 find 、 findAll 、 findIndexOf 、 sum 、 inject 、join 、 flatten 、 groupBy 、 any 、 every……
友情提示:以下特点对 Java 开发者或许陌生,不要怕,改善生活质量全靠它们了!
Why Goovy ?• 无处不在的闭包– 定义: def c= {…}– 特点:似函数而非函数,代码即数据
Why Goovy ?• 闭包的妙用:– 用 Map 构造临时对象
def m = [p:1, showP: {println m.p}]m.showP()
Why Goovy ?• 闭包的妙用:– 实现接口
// 只实现接口中的一个方法{……} as java.awt.event.MouseListenermethods = [ // 用 Map 实现多个方法 m1 : {......},//m1 和 m2 为对应实现的方法名 m2 : {......}]methods as java.awt.event.MouseListener
Why Goovy ?• Duck Typing :更高级的多态– 如果走路像鸭子,叫声像鸭子,那它就是鸭子
class Rectangle{ def draw(){ println "This is rectangle" }}class Square{ def draw(){ println "This is Square" }}def draw(painter){ painter.draw()}draw(new Rectangle())draw(new Square())
Why Goovy ?• GPars :并发编程其实也不是那么难 : )– 从 Groovy 1.8 起,作为扩展包随 Groovy 发
布。– 对多种并发编程模型提供了简洁的 DSL :• Actor 、 STM 、 Agent 、 CSP 、 Data Flow 等
final Actor actor = new DynamicDispatchActor({ when {String msg -> println 'A String'; reply 'Thanks'} when {Double msg -> println 'A Double'; reply 'Thanks'} when {msg -> println 'A something ...'; reply 'What was that?'}})actor.start()
Why Goovy ?• Grails : JVM 下的杀手级应用
摘自
《 T
he D
efin
itiv
e G
uid
e t
o G
rails
》
Why Goovy ?• 丰富多彩的生态系统
• glu :部署和监控自动化平台( LinkedIn 开源)• asgard :管理基于云的应用和基础设施的 Web 工具( Netflix 开源)• ……
还有……• 必需掌握的 Groovy 高级特性–MOP– AST Transformation– Builder
他们也在用 Groovy
• 更确切的说是在用 Grails– Reuters (路透社)– LinkedIn– Sky.com– NTT– Netflix–Wired.com– 更多的案例:• http://www.grails.org/Success+Stories
Groovy 2.0 的新变化• 更高的性能– 支持 JDK 7 的 Invoke Dynamic–@CompileStatic
• 对于 Java 更友好–@TypeChecked
• 模块性更强
详见: http://www.infoq.com/articles/new-groovy-20
参考书目
参考站点• Grails 官方站点: http://grails.org• Groovy
Blogs : http://groovyblogs.org• GroovyQ : http://www.groovyq.net
最后:一则发人深省的漫画……
摘自
:G
eek
And P
oke