SlideShare une entreprise Scribd logo
1  sur  30
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
                   最后:一则发人深省的漫画……

Contenu connexe

Tendances

手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech 手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech
luyongfugx
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程
Simon Su
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
zhen chen
 
快快樂樂學 Scrapy
快快樂樂學 Scrapy快快樂樂學 Scrapy
快快樂樂學 Scrapy
recast203
 

Tendances (11)

[Crypto Course] Hash
[Crypto Course] Hash[Crypto Course] Hash
[Crypto Course] Hash
 
Java_07:Thread
Java_07:ThreadJava_07:Thread
Java_07:Thread
 
我和阿九Azure有約 34 Azure File Storage 什麼時候適合用Azure File? File vs Disk Storage (Al...
我和阿九Azure有約 34 Azure File Storage 什麼時候適合用Azure File? File vs Disk Storage (Al...我和阿九Azure有約 34 Azure File Storage 什麼時候適合用Azure File? File vs Disk Storage (Al...
我和阿九Azure有約 34 Azure File Storage 什麼時候適合用Azure File? File vs Disk Storage (Al...
 
手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech 手机腾讯网Js资源版本增量更新方案w3ctech
手机腾讯网Js资源版本增量更新方案w3ctech
 
我和阿九Azure有約 38 Azure Blob Storage 如何省錢? 搞懂Access Tier (Alan Tsai 的學習筆記)
我和阿九Azure有約 38 Azure Blob Storage 如何省錢?搞懂Access Tier (Alan Tsai 的學習筆記)我和阿九Azure有約 38 Azure Blob Storage 如何省錢?搞懂Access Tier (Alan Tsai 的學習筆記)
我和阿九Azure有約 38 Azure Blob Storage 如何省錢? 搞懂Access Tier (Alan Tsai 的學習筆記)
 
Node.js從無到有 基本課程
Node.js從無到有 基本課程Node.js從無到有 基本課程
Node.js從無到有 基本課程
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
Web crawler - Scrapy
Web crawler - Scrapy Web crawler - Scrapy
Web crawler - Scrapy
 
快快樂樂學 Scrapy
快快樂樂學 Scrapy快快樂樂學 Scrapy
快快樂樂學 Scrapy
 
企業導入容器經驗分享與開源技能培養
企業導入容器經驗分享與開源技能培養企業導入容器經驗分享與開源技能培養
企業導入容器經驗分享與開源技能培養
 
UC奇趣百科性能优化分享
UC奇趣百科性能优化分享UC奇趣百科性能优化分享
UC奇趣百科性能优化分享
 

Similaire à Groovy:Candy for Java Developers

Groovy简介
Groovy简介Groovy简介
Groovy简介
profeter
 
Node js实践
Node js实践Node js实践
Node js实践
myzykj
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
tka
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starter
yiming he
 
3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究
Hsiao Tim
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
Jackson Tian
 

Similaire à Groovy:Candy for Java Developers (20)

淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle
 
Grails敏捷项目开发
Grails敏捷项目开发Grails敏捷项目开发
Grails敏捷项目开发
 
模块一-Go语言特性.pdf
模块一-Go语言特性.pdf模块一-Go语言特性.pdf
模块一-Go语言特性.pdf
 
Groovy简介
Groovy简介Groovy简介
Groovy简介
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析基于 FRIDA 的全平台逆向分析
基于 FRIDA 的全平台逆向分析
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
前端自動化工具
前端自動化工具前端自動化工具
前端自動化工具
 
開發流程與工具介紹
開發流程與工具介紹開發流程與工具介紹
開發流程與工具介紹
 
容器與 Gitlab CI 應用
容器與 Gitlab CI 應用容器與 Gitlab CI 應用
容器與 Gitlab CI 應用
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計
 
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
Continuous Delivery Workshop with Ansible x GitLab CI (3rd)
 
Node js实践
Node js实践Node js实践
Node js实践
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starter
 
3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究
 
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 Continuous Delivery Workshop with Ansible x GitLab CI (5th) Continuous Delivery Workshop with Ansible x GitLab CI (5th)
Continuous Delivery Workshop with Ansible x GitLab CI (5th)
 
Golangintro
GolangintroGolangintro
Golangintro
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 

Plus de foxgem

浅说Vertx
浅说Vertx浅说Vertx
浅说Vertx
foxgem
 
Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨
foxgem
 
移动开发的性能优化
移动开发的性能优化移动开发的性能优化
移动开发的性能优化
foxgem
 
Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架
foxgem
 
Groovy for Java Programmer
Groovy for Java ProgrammerGroovy for Java Programmer
Groovy for Java Programmer
foxgem
 
OpenParty西安:DSL in Groovy
OpenParty西安:DSL in GroovyOpenParty西安:DSL in Groovy
OpenParty西安:DSL in Groovy
foxgem
 
OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?
foxgem
 
OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?
foxgem
 

Plus de foxgem (9)

浅说Vertx
浅说Vertx浅说Vertx
浅说Vertx
 
Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨Our Choice:电子书的新交互方式探讨
Our Choice:电子书的新交互方式探讨
 
移动开发的性能优化
移动开发的性能优化移动开发的性能优化
移动开发的性能优化
 
持续交付 - 使用云计算和虚拟化技术
持续交付 - 使用云计算和虚拟化技术持续交付 - 使用云计算和虚拟化技术
持续交付 - 使用云计算和虚拟化技术
 
Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架Grails:下一代Java Web开发框架
Grails:下一代Java Web开发框架
 
Groovy for Java Programmer
Groovy for Java ProgrammerGroovy for Java Programmer
Groovy for Java Programmer
 
OpenParty西安:DSL in Groovy
OpenParty西安:DSL in GroovyOpenParty西安:DSL in Groovy
OpenParty西安:DSL in Groovy
 
OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?OpenParty西安:What does DevOps mean?
OpenParty西安:What does DevOps mean?
 
OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?OpenParty西安:How to be a good copycat?
OpenParty西安:How to be a good copycat?
 

Groovy:Candy for Java Developers