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 = 1
   new 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{
  class MyBean{     private int a
    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.MouseListener

 methods = [ //用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()
摘自《 The Definitive Guide to Grails 》



                                       • Grails:JVM下的杀手级应用
                                                             Why Goovy?
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
摘自:Geek And Poke
                   最后:一则发人深省的漫画……

Groovy:Candy for Java Developers